2012-03-12 20 views
5

मुझे कॉमन्स वीएफएस के साथ समस्या है। मैं एसएफटीपी का उपयोग कर एक निर्देशिका से कनेक्ट करना चाहता हूं और इसे सूचीबद्ध करना चाहता हूं। यहाँ कोड है:कॉमन्स वीएफएस - निर्देशिका की सामग्री सूचीबद्ध नहीं कर सकता

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

10

वीएफएस समाधान का कौन सा संस्करण अलग-अलग होगा। वीएफएस 2.0 के लिए आपको नीचे अतिरिक्त कॉन्फ़िगरेशन विकल्प शामिल करना होगा।

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

यह समस्या नहीं थी। आपका समाधान उन परिस्थितियों के लिए है जब आप चाहते हैं (विशेष रूप से यूनिक्स पर) एक पूर्ण पथ तक पहुंचें। – user219882

+3

मुझे यह सही समस्या थी, और इस कॉन्फ़िगरेशन विकल्प को मेरे लिए काम किया। अब मैं sftp के माध्यम से निर्देशिका सामग्री सूचीबद्ध कर सकते हैं। अपाचे दस्तावेज़ साइट गलत है। –

0

मैं एफ़टीपी के साथ काम कर रहा था और एसएफटीपी प्रोटोकॉल नहीं था लेकिन टॉमस के वर्णन के समान समस्या का सामना करना पड़ा। क्या मदद की निष्क्रिय मोड सक्षम करने गया था

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

जब हम 2.1 करने के लिए वीएफएस संस्करण 1.0 के लिए उन्नत किया और पाया कि प्रलेखन सही दिशा देता है के रूप में हम उपयोगकर्ता के घर निर्देशिका से रिश्तेदार पथ का उपयोग कर से बचने के लिए झंडा नीचे निर्धारित करने की आवश्यकता ही समस्या का सामना ।

डिफ़ॉल्ट रूप से, पथ उपयोगकर्ता की होम निर्देशिका से संबंधित है। इस के साथ बदला जा सकता है:

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

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