Autor Beitrag
Raven280438
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mi 20.07.11 12:28 
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:
ausblenden volle Höhe 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.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(01) == "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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mi 20.07.11 13:27 
Hi,

ich denke ich hab den Fehler beim Thread/BGWorker gefunden: ich hab ein
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: 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
ausblenden volle Höhe 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.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();            //HIER KOMMT DIE EXCEPTION
            }

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ß