2014-06-14 3 views
1

사용자 정의 퓨즈 미러 파일 시스템을 작성 중입니다 (FUSE-JNA를 사용하여 Ubuntu에서). 미러 란 내 말은 로컬 파일 시스템의 디렉토리를 읽고 쓰는 것을 의미합니다.퓨즈 - 쓰기 작업 구현

다음과 같이 getattr, create 및 read 연산을 구현했습니다. 이 모든 것이 완벽하게 작동합니다.

... 
private final String mirroredFolder = "./target/mirrored"; 
... 
... 

    public int getattr(final String path, final StatWrapper stat) 
{ 

    File f = new File(mirroredFolder+path);   

    //if current path is of file 
    if (f.isFile()) 
    { 
     stat.setMode(NodeType.FILE,true,true,true,true,true,true,true,true,true); 
     stat.size(f.length()); 
     stat.atime(f.lastModified()/ 1000L); 
     stat.mtime(0); 
     stat.nlink(1); 
     stat.uid(0); 
     stat.gid(0); 
     stat.blocks((int) ((f.length() + 511L)/512L)); 
     return 0; 
    } 


    //if current file is of Directory 
    else if(f.isDirectory()) 
    { 
     stat.setMode(NodeType.DIRECTORY); 
     return 0; 
    } 





    return -ErrorCodes.ENOENT(); 
} 
아래

만드는 방법은

public int create(final String path, final ModeWrapper mode, final FileInfoWrapper info) 
{ 
    File f = new File(mirroredFolder+path); 
    try { 
     f.createNewFile(); 
     mode.setMode(NodeType.FILE, true, true, true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    return 0; 
} 

읽기 방법은 미러 폴더

public int read(final String path, final ByteBuffer buffer, final long size, final long offset, final FileInfoWrapper info) 
{ 

    String contentOfFile=null; 
    try { 
     contentOfFile= readFile(mirroredFolder+path); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    final String s = contentOfFile.substring((int) offset, 
      (int) Math.max(offset, Math.min(contentOfFile.length() - offset, offset + size))); 
    buffer.put(s.getBytes()); 
    return s.getBytes().length; 

} 

에서 파일을 읽습니다하지만 내 쓰기 작업이 작동하지 않는 미러 폴더에 새 파일을 만듭니다.

다음은 내 Write 메서드입니다.이 메서드는 불완전합니다. 내가 디버거 모드에서 실행

public int write(final String path, final ByteBuffer buf, final long bufSize, final long writeOffset, 
     final FileInfoWrapper wrapper) 
{ 

    return (int) bufSize; 
} 

는, 경로 인자 경로 = /.

(xxx는 매번 쓰기 메서드가 호출 무작위 숫자입니다) goutputstream-xxx는 방법을 제대로 구현하는 나를 인도 해주십시오 보여줍니다 쓰기 작업.

답변

1

받은 파일 이름을 쓰십시오. How do I create a file and write to it in Java?

path=/.goutputstream-xxx이 표시되는 이유는 https://askubuntu.com/a/151124입니다. 이것은 fuse-jna의 버그가 아닙니다.

+0

만약 경로 인수에'/ .goutputstream-xxx'가 있으면 어떤 파일을 쓸지 어떻게 알 수 있습니까? 예를 들어 _abc.txt_ 파일을 편집하고 저장하면됩니다. write() 메소드의 path 인수는 현재 편집 된 파일 대신'/ .goutputstream-xxx'를 표시합니다. 우분투 버그를 알아. 12에서 우분투 버전 14로 업데이트했지만 여전히 같은 문제입니다. 어떤 OS가 지금/또는 다른 해결책을 시도해야합니까? –

+1

'/ .goutputstream-xxx'는'/ abc.txt'를 쓰는 텍스트 편집기와 관계없이 그 파일들에 쓰려고하는 lightdm 버그 때문에 발생합니다. '/ .goutputstream-xxx'가 나오면'/ .goutputstream-xxx'에 씁니다. 텍스트 편집기가 저장되면,'/ abc.txt'가됩니다. 이 함수는 여러 번 호출됩니다 (각 파일에 쓰기 위해 블록 당 한 번). 감사합니다. –

+0

. 이 프로젝트를 완료하여 여기에 공개했습니다. [Java FUSE 미러 파일 시스템] (https://github.com/Syed-Rahman-Mashwani/Java-FUSE-Mirror-File-System) –