2012-10-11 32 views
11

बनाएं, मैं एक फ़ाइल को जेएसएच लाइब्रेरी और एसएफटीपी प्रोटोकॉल का उपयोग कर दूरस्थ निर्देशिका में कॉपी करना चाहता हूं। यदि रिमोट होस्ट पर निर्देशिका मौजूद नहीं है, तो इसे बनाएं।किसी फ़ाइल को दूरस्थ निर्देशिका में रखने के लिए JSch का उपयोग करें और यदि निर्देशिका मौजूद नहीं है, तो इसे

एपीआई दस्तावेज़, http://epaul.github.com/jsch-documentation/javadoc/ में, मैं डाल विधि में देखा "मोड" का एक प्रकार है कि वहाँ लेकिन यह सिर्फ अंतरण विधा है: - स्थानांतरण मोड, फिर से शुरू में से एक, जोड़ने ओवरराइट करें।

क्या अस्तित्व की जांच के लिए अपना खुद का कोड लिखने के बिना ऐसा करने का कोई आसान तरीका है और फिर एक निर्देशिका को फिर से बनाते हैं?

उत्तर

24

जहां तक ​​मुझे पता नहीं है।

String[] folders = path.split("/"); 
for (String folder : folders) { 
    if (folder.length() > 0) { 
     try { 
      sftp.cd(folder); 
     } 
     catch (SftpException e) { 
      sftp.mkdir(folder); 
      sftp.cd(folder); 
     } 
    } 
} 

जहां sftpChannelSftp वस्तु है: मैं एक ही बात को प्राप्त करने के लिए निम्न कोड का उपयोग करें।

+0

इस महान काम करता है। हालांकि विधियों के आस-पास उन परेशान जगहों के बिना कोड को सही तरीके से प्रारूपित करें !! हाहाहा मजाक :) –

3

यदि आप एकाधिक थ्रेड के साथ दूरस्थ सर्वर से कनेक्ट करते हैं तो उत्तर ऊपर काम नहीं कर सकता है। उदाहरण के लिए विचार करें जब sftp.cd निष्पादित करता है वहां फ़ोल्डर "फोल्डर" नामक फ़ोल्डर नहीं होता है, लेकिन जब sftp.mkdir (फ़ोल्डर) को पकड़ने के खंड में निष्पादित किया जाता है तो अन्य थ्रेड ने इसे बनाया है। बेहतर तरीका (निश्चित रूप से यूनिक्स आधारित रिमोट सर्वर के लिए) चैनलएक्सैक का उपयोग करना और "mkdir -p" कमांड का उपयोग करके नेस्टेड निर्देशिका बनाना है।

+1

यह बहुत अच्छी सलाह नहीं है। एक खाता एसएफटीपी तक सीमित हो सकता है और अन्य एसएसएच संचालन करने से अवरुद्ध हो सकता है। और एक निर्देशिका बनाने के लिए एसएफटीपी के बजाय एसएसएच का उपयोग दौड़ की स्थिति को हल नहीं करता है कि एक और प्रक्रिया फाइल सिस्टम को बदल सकती है। एक एसएफटीपी क्लाइंट को इस तथ्य के प्रति लचीला होना चाहिए कि एक और प्रक्रिया फाइल सिस्टम को संशोधित कर सकती है। – Kenster

5

इस प्रकार मैं JSch में निर्देशिका अस्तित्व की जांच करता हूं।

निर्देशिका बनाएं यदि dir ont करता

ChannelSftp channelSftp = (ChannelSftp)channel; 
String currentDirectory=channelSftp.pwd(); 
String dir="abc"; 
SftpATTRS attrs=null; 
try { 
    attrs = channelSftp.stat(currentDirectory+"/"+dir); 
} catch (Exception e) { 
    System.out.println(currentDirectory+"/"+dir+" not found"); 
} 

if (attrs != null) { 
    System.out.println("Directory exists IsDir="+attrs.isDir()); 
} else { 
    System.out.println("Creating dir "+dir); 
    channelSftp.mkdir(dir); 
} 
2

अतिरिक्त सुविधाओं के साथ एक तैयार सार विधि के रूप में एक ही समाधान मौजूद हैं:

  • रास्तों कि फ़ाइल नामों को शामिल के साथ काम;
  • हटाएं अगर एक ही फ़ाइल पहले से मौजूद है।

    public boolean prepareUpload(
        ChannelSftp sftpChannel, 
        String path, 
        boolean overwrite) 
        throws SftpException, IOException, FileNotFoundException { 
    
        boolean result = false; 
    
        // Build romote path subfolders inclusive: 
        String[] folders = path.split("/"); 
        for (String folder : folders) { 
        if (folder.length() > 0 && !folder.contains(".")) { 
         // This is a valid folder: 
         try { 
         sftpChannel.cd(folder); 
         } catch (SftpException e) { 
         // No such folder yet: 
         sftpChannel.mkdir(folder); 
         sftpChannel.cd(folder); 
         } 
        } 
        } 
    
        // Folders ready. Remove such a file if exists:  
        if (sftpChannel.ls(path).size() > 0) { 
        if (!overwrite) { 
         System.out.println(
         "Error - file " + path + " was not created on server. " + 
         "It already exists and overwriting is forbidden."); 
        } else { 
         // Delete file: 
         sftpChannel.ls(path); // Search file. 
         sftpChannel.rm(path); // Remove file. 
         result = true; 
        } 
        } else { 
        // No such file: 
        result = true; 
        } 
    
        return result; 
    }