2011-08-09 6 views
18

मुझे एक एसएफटीपी सर्वर से डायनामिक फ़ाइल नामों के साथ सीएसवी फाइलों का एक गुच्छा पढ़ना है। ये फ़ाइलें हर 15 मिनट में उत्पन्न होती हैं।जेएसएच चैनलएसएफटीपी का उपयोग करना: डायनामिक नामों के साथ कई फाइलें कैसे पढ़ें?

मैं जेएसएच के चैनलस्फ्ट का उपयोग कर रहा हूं, लेकिन कोई विधि नहीं है जो सटीक फ़ाइल नाम देगी। मुझे केवल .ls() विधि दिखाई देती है। यह एक वेक्टर उदा।

[drwxr-xr-x 2 2019  2019   144 Aug 9 22:29 ., 
drwx------ 6 2019  2019   176 Aug 27 2009 .., 
-rw-r--r-- 1 2019  2019   121 Aug 9 21:03 data_task1_2011_TEST.csv, 
-rw-r--r-- 1 2019  2019   121 Aug 9 20:57 data_task1_20110809210007.csv] 

वहाँ एक निर्देशिका में सभी फ़ाइलों को पढ़ने और उन्हें किसी अन्य स्थान पर प्रतिलिपि बनाने के लिए एक आसान तरीका है?

इस कोड को एक एकल फाइल कॉपी करने के लिए काम करता है:

JSch jsch = new JSch(); 
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT); 
session.setPassword(SFTPPASS); 
java.util.Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 
session.connect(); 
channel = session.openChannel("sftp"); 
channel.connect(); 
channelSftp = (ChannelSftp)channel; 
channelSftp.cd(SFTPWORKINGDIR); 
channelSftp.get("data_task1_20110809210007.csv","data_task1_20110809210007.csv"); 

उत्तर

44

ls विधि एक आप की जरूरत है। यह LsEntry ऑब्जेक्ट्स का वेक्टर देता है, जिनमें से प्रत्येक आप इसके नाम के बारे में पूछ सकते हैं।

तो, अपने channelSftp.cd(SFTPWORKINGDIR); के बाद, आप निम्न कर सकता है: (। इसका मतलब यह है destinationPath एक स्थानीय निर्देशिका / के साथ समाप्त होने का नाम है (या \ Windows में))

Vector<ChannelSftp.LsEntry> list = channelSftp.ls("*.cvs"); 
for(ChannelSftp.LsEntry entry : list) { 
    channelSftp.get(entry.getFilename(), destinationPath + entry.getFilename()); 
} 

बेशक

, यदि आप 15 मिनट के बाद एक ही फाइल को फिर से डाउनलोड नहीं करना चाहते हैं, तो आप उनकी तुलना करने के लिए स्थानीय फ़ाइलों की एक सूची लेना चाहेंगे (हैशसेट या इसी तरह का उपयोग करें), या सर्वर से उन्हें हटा दें।

+0

धन्यवाद पैलो एबरमान के बावजूद यह विधि सभी सीएसवी फाइलों को पुनर्प्राप्त करती है। वह जल्दी है। आपकी सहायता की सराहना। – pingu

+2

आप भाग्यशाली थे मेरे पास [मेरे देखे गए टैग] (http://stackexchange.com/filters/19305/palos-filter) में 'jsch' है, और जहां आपने पोस्ट करने के कुछ मिनट बाद ही जांच की :-)। मदद करने में खुशी। –

+0

क्या यह कोड अभी भी jsch 1.49 के लिए लागू है? – ides

2

ध्यान दें कि ls केस संवेदनशील है। एक्सटेंशन विधि

ArrayList<String> list = new ArrayList<String>(); 
Vector<LsEntry> entries = sftpChannel.ls("*.*"); 
for (LsEntry entry : entries) { 
    if(entry.getFilename().toLowerCase().endsWith(".csv")) { 
     list.add(entry.getFilename()); 
    } 
} 
संबंधित मुद्दे