2012-06-27 28 views
5

Tôi muốn xây dựng một ứng dụng hệ thống tập tin dưới đất dựa trên FUSE, trong Java. Có một vài thư viện liên kết có sẵn trên web, Fuse-J, jnetfs, Fuseforjava, javafuse.Bất kỳ javafuse cơ hội nào cũng có thể hoạt động?

Không ai trong số họ có vẻ thực sự sống động như hôm nay, vì vậy tôi đã thử lần đầu tiên JavaFuse.

Giao diện chúng ta phải thực hiện là ở đó: http://code.google.com/p/javafuse/source/browse/fs/JavaFS.java

và tôi muốn để tái tạo fuse helloworld example này.


Câu hỏi: Có cơ hội rằng đây:

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler, 
        off_t offset, struct fuse_file_info *fi) 
{ 
(void) offset; 
(void) fi; 

if(strcmp(path, "/") != 0) 
    return -ENOENT; 

filler(buf, ".", NULL, 0); 
filler(buf, "..", NULL, 0); 
filler(buf, hello_path + 1, NULL, 0); 

return 0; 
} 

có thể được thực hiện bởi chức năng java này:

public int readdir_pre(String path, long buf, long filler, int offset, Fuse_file_info info); 
public int readdir_post(String path, long buf, long filler, int offset, Fuse_file_info info, int result); 

Có lẽ tôi đã bỏ lỡ một cái gì đó, nhưng tôi không thể nhìn thấy làm thế nào để sử dụng filler để cư trú trong nội dung thư mục ...

Có kỳ dị khác chỉ ví dụ helloworld này, như:

public int read_post(String path, String buf, int size, int offset, Fuse_file_info info, int result); 

đó là nghĩa vụ phải điềnbuf với size byte dữ liệu, trong khi Java String được cho là không thay đổi.

+0

Tôi sẽ sugest sử dụng https://github.com/EtiennePerot/fuse-jna – user629926

+0

có, có vẻ thú vị. Nhưng tôi đã chuyển sang [JNetFs] (https://code.launchpad.net/jnetfs) đã trả lời tất cả các yêu cầu của tôi cho đến nay! (mặc dù một số ràng buộc vẫn còn thiếu trong thư viện C, tôi phải tự ràng buộc chúng) – Kevin

+0

+1 để có danh sách các triển khai FUSE-Java. –

Trả lời

0

Tôi không chắc chắn chính xác, những gì bạn đang cố gắng làm với chức năng kép read_pre & read_post.

Mặc dù tôi đoán, chúng đại diện cho công việc trước và sau công việc. Có thể bạn có thể khai báo số bình thường readdir() và gọi cho bạn trước & bài đăng từ bên trong? Chuyển cùng một đối số trở lại &? Vì bạn phải khai báo readdir() đến fuse_main().

Và về điều thứ hai với bộ đệm, nó chỉ mong đợi một byte lưu giữ. Bạn có thể truyền các mảng ký tự hoặc bất kỳ thứ gì có byte trong đó, được biểu thị bằng size_t size thể hiện kích thước của bộ đệm. Trong helloworld.c, các ký tự chuỗi được sao chép vào bộ đệm thông qua memcpy(). Bạn có thể đọc các byte từ tệp và chuyển chúng thành bộ đệm cùng với độ dài thích hợp.

Tôi mới đến FUSE và muốn biết nó như thế nào là làm việc sử dụng Java so với tiêu chuẩn C.

+0

bạn chắc chắn đúng trong dự đoán của bạn, nhưng kết quả là như nhau, thư viện 'javafuse' này dường như không thể sử dụng được ... chức năng' memcpy() 'không có sẵn trong Java, và do đó chúng tôi không có cách cung cấp thông tin cần thiết. – Kevin

1

Bạn có thể thử jnr-fuse dự án.

Dự án sử dụng JNR, do đó bạn đạt được hiệu suất JNI đầy đủ và dễ triển khai.

Ví dụ về triển khai hello-world filesystem bộ lọc.