Entwickler-Ecke
ASP.NET und Web - FTP-Verzeichnisse rekursiv auflisten
Raven280438 - Mi 20.07.11 12:28
Titel: FTP-Verzeichnisse rekursiv auflisten
Hi,
Ich bin noch ziemlicher Anfänger und hab gleich 2 Probleme:
Ich möchte alle Verzeichnisse auf einem FTP-Server rekursiv auflisten. Das funktioniert aber nur die ersten paar Verzeichnisse, dann gibts immer ein TimeOut vom Server.
Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| public void GetBackupSizeRecursive(String dir) { FtpWebRequest FTPWebRequest = null; FtpWebResponse FTPWebResponse = null;
StreamReader reader = null;
try { FTPWebRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://" + server + "/" + dir + "/"); FTPWebRequest.Credentials = new NetworkCredential(this.USER, this.PASS); FTPWebRequest.Method = WebRequestMethods.http://Ftp.ListDirectoryDetails; FTPWebRequest.UseBinary = true; FTPWebRequest.UsePassive = true; FTPWebRequest.Timeout = 5000;
FTPWebResponse = (FtpWebResponse)FTPWebRequest.GetResponse();
reader = new StreamReader(FTPWebResponse.GetResponseStream()); } catch (Exception ex) { this.Invoke((MethodInvoker)delegate() { this.tB_Process.AppendText("Das Verzeichnis " + dir + " konnte nicht ausgelesen werden:" + Environment.NewLine + ex.Message) ; }); return; }
while (reader.Peek() >= 0) { String Line = reader.ReadLine();
String[] Values = Line.Split(new char[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
if (Values[8] != "." && Values[8] != "..") { if (Line.Substring(0, 1) == "d") { this.uDirCount++; this.GetBackupSizeRecursive(dir + "/" + Values[8]); } else { this.uFileCount++; this.uSize += Convert.ToUInt32(Values[4]); } } }
FTPWebResponse.Close(); } |
Was mache ich Falsch?
Das zweite Problem ist, dass solange das Auflisten dauert, das Programm nichtmehr bedienbar ist. Ich habs schon mit einem Background-Worker und Threads probiert, aber das bringt auch nix.
Hat jemand ne Idee?
Gruß
Th69 - Mi 20.07.11 13:16
Hallo,
ich denke, den Timeout bekommst du, weil du jeweils mit einer neuen FTPWebRequest-Instanz auf den FTP-Server zugreifst ohne die alte Instanz zu schließen.
Besser wäre es wahrscheinlich, wenn du dir erst die Verzeichnisse in einer Liste (List<string>) merkst, dann die aktuelle FTPWebRequest-Instanz schließt und danach dann die Liste abarbeitest.
Und zum zweiten hast du mit dem BackgroundWorker bzw. Thread recht - du hast diese wahrscheinlich nur falsch angewendet.
Raven280438 - Mi 20.07.11 13:27
Hi,
ich denke ich hab den Fehler beim Thread/BGWorker gefunden: ich hab ein
C#-Quelltext
1: 2: 3: 4:
| this.Invoke((MethodInvoker)delegate() { [...] }); |
um die gesamte Thread-Abarbeitung gemacht, das hat warscheinlich blockiert...
Leider weis ich nicht wie ich es besser machen kann. Ich benötige die ausgewählten Items eines ListViews aus einem anderen Form.
Die hole ich mit
C#-Quelltext
1: 2: 3: 4:
| this.Invoke((MethodInvoker)delegate() { this.selection = this.MainForm.lV_FTP.SelectedItems; }); |
Das Problem ist dann aber, dass ich in dem Thread nichtmehr drauf zugreifen kann.
Zitat: |
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lV_FTP erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde. |
Wie kann ich auf die SelectedItems des ListViews zugreifen und damit arbeiten?
Edit: Wäre eine Möglichkeit die ausgewählten Items als String in einer List zu speichern und an das Form zu übergeben?
Gruß
Raven280438 - Mi 20.07.11 13:56
Hi,
also das mit dem Thread is jetz geklärt. Ich Speicher beim Laden des Forms die SelectedItems in einer List<String>.
Jetzt hab ich aber ein neues Problem:
Manchmal bekomm ich bei folgendem Code
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| FtpWebRequest FTPWebRequest = null; FtpWebResponse FTPWebResponse = null;
StreamReader reader = null;
try { FTPWebRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://" + this.MainForm.KAS_API.KAS_API_USER + ".kasserver.com/" + dir + "/"); FTPWebRequest.Credentials = new NetworkCredential(KAS_USER, KAS_PASS); FTPWebRequest.Method = WebRequestMethods.http://Ftp.ListDirectoryDetails; FTPWebRequest.UseBinary = true; FTPWebRequest.UsePassive = true; FTPWebRequest.Timeout = 5000;
FTPWebResponse = (FtpWebResponse)FTPWebRequest.GetResponse();
reader = new StreamReader(FTPWebResponse.GetResponseStream()); } catch (Exception ex) { this.Invoke((MethodInvoker)delegate() { this.tB_Process.AppendText("Das Verzeichnis " + dir + " konnte nicht ausgelesen werden:" + Environment.NewLine + ex.Message) ; }); return; }
this.Invoke((MethodInvoker)delegate() { this.tB_Process.AppendText("Lese Verzeichnis " + dir + "..." + Environment.NewLine); });
List<String> Verzeichnisse = new List<String>();
while (reader.Peek() >= 0) { String Line = reader.ReadLine(); Verzeichnisse.Add(Line); } if (FTPWebResponse != null) { FTPWebResponse.Close(); } |
eine Exception:
Zitat: |
Der Remoteserver hat einen Fehler zurückgegeben: (451) Lokaler Verarbeitungsfehler. |
Woran kann das liegen? Es tritt nur bei vielen Verzeichnissen auf, und da auch nur manchmal...
Gruß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!