Diese Bibliothek hat einige Macken, die diese rekursive Auflistung heikel, weil die Wechselwirkung zwischen dem ChangeDirectory
und ListDirectory
machen nicht wie erwartet funktionieren kann.
Die folgende tut nicht Liste der Dateien im Verzeichnis/home stattdessen listet die Dateien im Verzeichnis/(root) Verzeichnis:
sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);
Das folgende ist nicht Arbeit und gibt einen SftpPathNotFoundException:
sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);
im folgenden ist der richtige Weg, um die Dateien im Verzeichnis/home zur Liste
sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);
Das ist ziemlich verrückt, wenn Sie mich fragen. Das Festlegen des Standardverzeichnisses mit der Methode ChangeDirectory
hat keine Auswirkungen auf die Methode ListDirectory
, es sei denn, Sie geben einen Ordner im Parameter dieser Methode an. Scheint wie ein Bug sollte dafür geschrieben werden.
Wenn Sie also Ihre rekursive Funktion schreiben, müssen Sie das Standardverzeichnis einmal festlegen und dann das Verzeichnis im ListDirectory
-Aufruf ändern, während Sie über die Ordner iterieren. Die Auflistung gibt eine Auflistung von SftpFiles zurück. Diese können dann einzeln auf IsDirectory == true
überprüft werden. Beachten Sie, dass die Auflistung auch die .
und ..
Einträge (die Verzeichnisse sind) zurückgibt. Sie sollten diese überspringen, wenn Sie eine Endlosschleife vermeiden möchten.
:-)
EDIT 2/23/2018
ich einige meiner alten Antworten überprüfen und möchte mich für die Antwort oben und geben Sie die folgenden Arbeits Code entschuldigen. Beachten Sie, dass dieses Beispiel nicht ChangeDirectory
erfordert, da sie die Fullname
für die ListDirectory
ist mit:
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);
}
}
}
sftp.ListDirectory ("") funktioniert nicht, aber sftp.ListDirectory (".") Tut - erinnern, '.' bedeutet "aktuelles Verzeichnis". Es scheint jedoch nicht die '~' Verknüpfung für Home-Ordner zu unterstützen. – Gargravarr
Danke für die Erklärung, gibt es ein komplettes Beispiel, wie man eine Liste oder eine Baumstruktur aller Verzeichnisse und Unterverzeichnisse ab einem bestimmten Stammordner erhält? Ich frage mich, warum ssh.net keine bool recursive in der ListDirectory-Methode selbst bietet. Gibt es heutzutage eine bessere Lösung für .net? I.e. eine bessere lib, die auch frei ist, die diese grundlegenden aufgaben bereits implementiert? Ein funktionierendes Beispiel wäre jedoch sehr hilfreich, danke! – Erik