इस पुस्तकालय कुछ quirks है कि इस पुनरावर्ती सूची मुश्किल कर दिया है।
निम्नलिखित नहीं सूची/घर निर्देशिका में फ़ाइलों करता है बजाय इसे/(रूट) में फ़ाइलों को सूचीबद्ध निर्देशिका:
sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);
निम्नलिखित है नहीं काम करते हैं और एक SftpPathNotFoundException रिटर्न:
sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);
निम्नलिखित/घर निर्देशिका में फ़ाइलों को सूचीबद्ध करने के लिए सही तरीका है
+०१२३५१६४१०६१
sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);
यदि आप मुझसे पूछें तो यह बहुत पागल है। ChangeDirectory
विधि के साथ डिफ़ॉल्ट निर्देशिका को सेट करने से ListDirectory
विधि पर कोई प्रभाव नहीं पड़ता है जब तक कि आप इस विधि के पैरामीटर में कोई फ़ोल्डर निर्दिष्ट नहीं करते हैं। ऐसा लगता है कि इसके लिए एक बग लिखा जाना चाहिए।
तो जब आप अपना रिकर्सिव फ़ंक्शन लिखते हैं तो आपको एक बार डिफ़ॉल्ट निर्देशिका सेट करनी होगी और फिर ListDirectory
कॉल में निर्देशिका को बदलना होगा क्योंकि आप फ़ोल्डरों पर फिर से चलते हैं। लिस्टिंग SftpFiles की एक संख्यात्मक वापसी देता है। फिर IsDirectory == true
के लिए इन्हें व्यक्तिगत रूप से चेक किया जा सकता है। बस जागरूक रहें कि लिस्टिंग .
और ..
प्रविष्टियां (जो निर्देशिकाएं हैं) लौटाती है। यदि आप एक अनंत लूप से बचना चाहते हैं तो आप इन्हें छोड़ना चाहेंगे। :-)
संपादित 2/23/2018
मैं अपना पुराना जवाब में से कुछ की समीक्षा की गई थी और इसके बाद के संस्करण उत्तर के लिए क्षमा चाहते हैं और अगले कार्य कोड की आपूर्ति करना चाहते हैं। ध्यान दें कि यह उदाहरण ChangeDirectory
की आवश्यकता नहीं है, क्योंकि यह ListDirectory
के लिए Fullname
उपयोग कर रहा है:
void Main()
{
using (var client = new Renci.SshNet.SftpClient("sftp.host.com", "user", "password"))
{
var files = new List<String>();
client.Connect();
ListDirectory(client, ".", ref files);
client.Disconnect();
files.Dump();
}
}
void ListDirectory(SftpClient client, String dirName, ref List<String> files)
{
foreach (var entry in client.ListDirectory(dirName))
{
if (entry.IsDirectory)
{
ListDirectory(client, entry.FullName, ref files);
}
else
{
files.Add(entry.FullName);
}
}
}
स्रोत
2014-07-01 18:57:41
sftp.ListDirectory ("") काम नहीं करता है, लेकिन sftp.ListDirectory ("।") करता है - याद रखें, '।' का मतलब है 'वर्तमान निर्देशिका'। हालांकि, यह घर फ़ोल्डर के लिए '~' शॉर्टकट का समर्थन नहीं करता प्रतीत होता है। – Gargravarr
स्पष्टीकरण के लिए धन्यवाद, क्या एक पूर्ण उदाहरण है कि वास्तव में किसी दिए गए रूट फ़ोल्डर से शुरू होने वाली सभी निर्देशिकाओं और उपनिर्देशिकाओं की सूची या पेड़ कैसे प्राप्त करें? मुझे आश्चर्य है कि क्यों ssh.net सूची डायरेक्टरी विधि में एक बूल रिकर्सिव ऑफर नहीं करता है। क्या इन दिनों .NET के लिए कोई बेहतर समाधान उपलब्ध है? अर्थात। एक बेहतर lib जो भी मुफ़्त है, जो पहले से ही इन बुनियादी कार्यों को लागू करता है? हालांकि, एक कामकाजी उदाहरण बहुत उपयोगी होगा, धन्यवाद! – Erik