2012-03-12 97 views
5

我對Commons VFS有問題。我想要使​​用SFTP連接到一個目錄並列出它。下面是代碼:Commons VFS - 無法列出目錄的內容

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()); 
} 

看來,fsManager解析正確,但getChildren()失敗。我發現sourceDir是一個IMAGINARY類型;下面的代碼說它

logger.debug(sourceDir.getType()); 

我檢查了文件,它是一個普通的文件夾 - 不是一個鏈接或類似的東西。

錯誤

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) 

回答

3

按照documentation獲得 「目錄內容」 不支持的文件系統SFTP。

+2

見@最多的回答。 – hotshot309 2013-11-19 17:39:13

10

取決於哪個版本的VFS解決方案會有所不同。對於VFS 2.0,您必須在下面添加其他配置選項。

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

這不是問題。您的解決方案適用於您希望(特別是在Unix上)訪問絕對路徑的情況。 – user219882 2012-04-05 07:57:14

+3

我有這個確切的問題,並設置此配置選項爲我工作。我現在可以通過sftp列出目錄內容。 Apache文檔網站是錯誤的。 – 2013-05-12 20:36:46

0

我正在使用FTP而不是SFTP協議,但遇到了與Tomas描述的相同的問題。是什麼幫助被啓用被動模式

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

面臨着同樣的問題,當我們升級的VFS版本1.0到2.1,發現文檔提供給正確的方向,我們需要設置下面的標誌,以避免使用從用戶的主目錄的相對路徑。

默認情況下,路徑是相對於用戶的主目錄。這可以被改變:

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

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