Auflistung server-Ordner und sub-Ordner mit C# FtpWebRequest
Ich versuche, um die komplette Liste der Dateien, Verzeichnisse und Unterverzeichnisse auf Baum-Ansicht mit StreamReader
. Das problem ist, es zu lange dauerte und zu wirft *"Operation Timeout exception" und zeigt nur eine Ebene.
Hier ist mein code
public void getServerSubfolder(TreeNode tv, string parentNode) {
string ptNode;
List<string> files = new List<string> ();
try {
FtpWebRequest request = (FtpWebRequest) WebRequest.
Create(parentNode);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(this.userName, this.Password);
request.UseBinary = true;
request.UsePassive = true;
request.Timeout = 10000;
request.ReadWriteTimeout = 10000;
request.KeepAlive = false;
FtpWebResponse response = (FtpWebResponse) request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string fileList;
string[] fileName;
//MessageBox.Show(reader.ReadToEnd().ToString());
while (!reader.EndOfStream) {
fileList = reader.ReadLine();
fileName = fileList.Split(' ');
if (fileName[0] == "drwxr-xr-x") {
//if it is directory
TreeNode tnS = new TreeNode(fileName[fileName.Length - 1]);
tv.Nodes.Add(tnS);
ptNode = parentNode + "/" + fileName[fileName.Length - 1] + "/";
getServerSubfolder(tnS, ptNode);
} else files.Add(fileName[fileName.Length - 1]);
}
reader.Close();
response.Close();
} catch (Exception ex) {
MessageBox.Show("Sub--here " + ex.Message + "----" + ex.StackTrace);
}
}
Ich habe es mit unterschiedlichen time-out-zahlen.
InformationsquelleAutor Habtamu | 2013-04-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mache ich ähnliche Dinge, aber statt mit StreamReader.ReadLine() ein, bekomme ich alles auf einmal mit StreamReader.ReadToEnd(). Sie brauchen nicht ReadLine() um eine Liste von Verzeichnissen. Unten ist mein gesamter code (Gesamte howto erklärt in diese tutorial):
InformationsquelleAutor Prahlad Yeri
Müssen Sie Lesen (und cache) gesamte Liste, bevor recursing in Unterverzeichnisse, sonst ist die top-level-Anforderung timeout, bevor Sie die komplette Unterverzeichnisse auflisten.
Können Sie halten mit
ReadLine
, keine Notwendigkeit zu verwendenReadToEnd
und trennen Sie die Zeilen selbst.Verwenden Sie die Funktion wie:
Nachteil des obigen Ansatzes ist, dass es zum analysieren von server-spezifische Auflistung zum abrufen von Informationen über Dateien und Ordner. Der code oben rechnet eine Allgemeine *nix-Stil listing. Aber viele Server, die ein anderes format verwenden.
Den
FtpWebRequest
leider nicht unterstütztMLSD
Befehl, das ist der einzige tragbare Möglichkeit zum abrufen directory-listing mit dem Datei-Attribute im FTP-Protokoll.Wenn Sie wollen vermeiden, dass Probleme mit der Analyse der server-spezifische, Verzeichnisliste Formate, verwenden Sie ein 3rd-party-Bibliothek, die unterstützt die
MLSD
Befehl und/oder Analyse von verschiedenenLIST
listing-Formate; und rekursive downloads.Beispielsweise mit WinSCP .NET-assembly können Sie eine Liste ganze Verzeichnis mit einem einzigen Aufruf der
Session.EnumerateRemoteFiles
:Intern, WinSCP verwendet das
MLSD
Befehl, wenn vom server unterstützt wird. Wenn nicht, verwendet es dieLIST
- Befehl und unterstützt Dutzende von verschiedenen angebotsformate.(Ich bin der Autor von WinSCP)
InformationsquelleAutor Martin Prikryl