사용자 정의 퓨즈 미러 파일 시스템을 작성 중입니다 (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는 방법을 제대로 구현하는 나를 인도 해주십시오 보여줍니다 쓰기 작업.
만약 경로 인수에'/ .goutputstream-xxx'가 있으면 어떤 파일을 쓸지 어떻게 알 수 있습니까? 예를 들어 _abc.txt_ 파일을 편집하고 저장하면됩니다. write() 메소드의 path 인수는 현재 편집 된 파일 대신'/ .goutputstream-xxx'를 표시합니다. 우분투 버그를 알아. 12에서 우분투 버전 14로 업데이트했지만 여전히 같은 문제입니다. 어떤 OS가 지금/또는 다른 해결책을 시도해야합니까? –
'/ .goutputstream-xxx'는'/ abc.txt'를 쓰는 텍스트 편집기와 관계없이 그 파일들에 쓰려고하는 lightdm 버그 때문에 발생합니다. '/ .goutputstream-xxx'가 나오면'/ .goutputstream-xxx'에 씁니다. 텍스트 편집기가 저장되면,'/ abc.txt'가됩니다. 이 함수는 여러 번 호출됩니다 (각 파일에 쓰기 위해 블록 당 한 번). 감사합니다. –
. 이 프로젝트를 완료하여 여기에 공개했습니다. [Java FUSE 미러 파일 시스템] (https://github.com/Syed-Rahman-Mashwani/Java-FUSE-Mirror-File-System) –