2012-03-12 29 views
5

Tôi gặp sự cố với Commons VFS. Tôi muốn kết nối với một thư mục bằng SFTP và liệt kê nó. Đây là mã:Commons VFS - Không thể liệt kê nội dung của thư mục

FileSystemOptions opts = new FileSystemOptions(); 
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no"); 
FileSystemManager fsManager = VFS.getManager(); 

FileObject sourceDir = fsManager.resolveFile(sourceUrl, opts); 
FileObject targetDir = fsManager.resolveFile(config.get("to")); 

for (FileObject sourceFile : sourceDir.getChildren()) { // here is the problem 
    FileObject targetFile = fsManager.resolveFile(targetDir + "/" + nodeName + "_" 
      + sourceFile.getName().getBaseName()); 
    logger.debug("Copying files. Source: " + sourceFile.getName().getPath() + " Target: " 
      + targetFile.getName().getPath()); 
} 

Dường như fsManager giải quyết nó một cách chính xác nhưng getChildren() thất bại. Tôi phát hiện ra rằng sourceDir là loại IMAGINARY; đoạn mã sau nói rằng nó

logger.debug(sourceDir.getType()); 

Tôi đã kiểm tra tệp và đó là một thư mục thông thường - không phải liên kết hoặc một thứ gì đó tương tự.

Lỗi

org.apache.commons.vfs2.FileNotFolderException: Could not list the contents of "sftp://path/to/dir" because it is not a folder. 
    at org.apache.commons.vfs2.provider.AbstractFileObject.getChildren(AbstractFileObject.java:693) 
    at pkg.services.impl.QuartzJobEventLog.downloadEventLogs(QuartzJobEventLog.java:64) 
    at pkg.services.impl.QuartzJobEventLog.executeJob(QuartzJobEventLog.java:37) 
    at pkg.services.impl.AbstractQuartzJob.execute(AbstractQuartzJob.java:25) 
    at $QuartzJob_1360635dbcd.execute($QuartzJob_1360635dbcd.java) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:203) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520) 

Trả lời

3

Theo documentation nhận được "nội dung thư mục" không được hỗ trợ cho hệ thống tập tin SFTP.

+2

Xem @ câu trả lời của Max. – hotshot309

10

Tùy thuộc vào phiên bản nào của giải pháp VFS sẽ khác nhau. Đối với VFS 2.0, bạn phải bao gồm tùy chọn cấu hình bổ sung bên dưới.

SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false); 
+1

Đó không phải là vấn đề ở đây. Giải pháp của bạn là cho các tình huống khi bạn muốn (đặc biệt là trên Unix) truy cập một đường dẫn tuyệt đối. – user219882

+3

Tôi đã gặp sự cố chính xác này và việc đặt tùy chọn cấu hình này hoạt động cho tôi. Bây giờ tôi có thể liệt kê các nội dung thư mục thông qua sftp. Trang web tài liệu Apache là sai. –

0

Tôi đã làm việc với FTP chứ không phải giao thức SFTP nhưng gặp phải vấn đề tương tự như mô tả của Tomas. Có gì giúp được cho phép chế độ thụ động

FtpFileSystemConfigBuilder.getInstance().setPassiveMode(opts, true); 
0

Phải đối mặt với vấn đề tương tự khi chúng tôi nâng cấp phiên bản VFS 1,0-2,1 và tìm thấy tài liệu cung cấp cho để đi đúng hướng như chúng ta cần phải đặt dưới cờ để tránh sử dụng đường dẫn tương đối từ thư mục home của người dùng .

Theo mặc định, đường dẫn có liên quan đến thư mục chính của người dùng. Điều này có thể được thay đổi với:

FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(options, false); 

https://commons.apache.org/proper/commons-vfs/filesystems.html#SFTP

Các vấn đề liên quan