Autor Beitrag
Maldö
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 01.01.11 18:47 
Hi!
Ich schreibe momentan einen Downloadmanager für mehrere Dateien.
Das runterladen funktioniert auch ganz gut.

Es gibt einen Großes Thread "LoadDownloads". Der die Dateien aus der Downloadliste, welche in einer XML Datei hinterlegt sind sofern sie noch nicht runtergeladen wurden runterlädt. (Pause/Abbrechen bau ich später ein).
Er erstellt also für jeden Download einen Extra Thread und startet sobald alle download Threads gestartet sind folgende 2 Threads:

UpdateStatus
UpdateDLSpeed.

Auch das klappt alles >einwandfrei<

Doch die heruntergeladene Datei ist genau etwa 1/100stel kleiner. (siehe screenshot)

Kann das daran liegen?

Datei liegt auf einen Server mit dem OS Linux ?

Aber jetz kommt es... im code steht erst wenn BytesOnDisk == BytesOnServer ist soll er die Datei ausm Temp Verzeichnis ins richtige kopieren.

Nach etwa 5 Minuten warte Zeit bei Prozent 99 macht er das auch. Datei ist aber dennoch kleiner als Auf dem Server (Byte vergleich).

1. Weiß ich nicht wie das Möglich sein soll und 2. weiß ich nicht wie ich dieses Problem beheben / umgehen kann.

Anbei ein kleiner Codesausschnitt.

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:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
 private void PercenNowVoid()
        {

                int indexes = MyDownloads.RowCount-1;
                for (int x = 0; x < indexes; x++)
                {

                    string filename = MyDownloads.Rows[x].Cells[1].Value.ToString();
                    long filesize = Convert.ToInt64((MyDownloads.Rows[x].Cells[3].Value.ToString()).Replace("Bytes",""));

                    if (MyDownloads.Rows[x].Cells[4].Value != "Fertig." && MyDownloads.Rows[x].Cells[4].Value != "Kopiere...")
                    {
                    if (File.Exists(@"C:\NFloader\TEMP\" + filename + ""))
                    {
                        FileInfo F = new FileInfo(@"C:\NFloader\TEMP\" + filename + "");
                        decimal Prozent = (F.Length * 100) / filesize;
                   
                        ///
                        int II = Convert.ToInt32(Math.Round(Prozent));
                        if (MyDownloads.Rows[x] != null)
                        {


                            if (Prozent < 100)
                            {
                                MyDownloads.Rows[x].DefaultCellStyle.BackColor = System.Drawing.Color.Orange;
                                MyDownloads.Rows[x].Cells[4].Value = Prozent.ToString();
                                label3.ExecuteThreadSafe(() => label3.Text = F.Length.ToString() + "/" + filesize);
                            }
                            else
                            {


                                if (F.Length == filesize)
                                {

                                    MyDownloads.Rows[x].Cells[4].Value = "Kopiere...";

                                    if (!File.Exists(@"C:\NFloader\" + filename)) File.Copy(@"C:\NFloader\TEMP\" + filename + ""@"C:\NFloader\" + filename,true);
                                    else
                                    {
                                        if (MyDownloads.Rows[x].Cells[4].Value != "Fertig.")
                                        {
                                            MyDownloads.Rows[x].DefaultCellStyle.BackColor = System.Drawing.Color.Green;
                                            MyDownloads.Rows[x].Cells[4].Value = "Fertig.";
                                        }
                                    }
                                }
                                else
                                {
                                    MyDownloads.Rows[x].DefaultCellStyle.BackColor = System.Drawing.Color.Blue;
                                    MyDownloads.Rows[x].Cells[4].Value = "Validiere...";

                                }
                            }

                        }
                        
                        }
                    }
                }
                Thread T1 = new Thread(new ThreadStart(PercenNowVoid));
                T1.Start();
        }


Zuletzt bearbeitet von Maldö am Sa 01.01.11 19:55, insgesamt 1-mal bearbeitet
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 01.01.11 19:13 
Hallo und :welcome:
im Forum!
Existiert denn das Problem immer noch, oder konntest Du schon eine Lösung finden? Denn die Frage ist als gelöst markiert. Wenn sich das Problem erledigt hat, wäre es toll, wenn Du schreibst, woran es lag.
Lassen sich denn die heruntergeladenen Dateien problemlos öffnen, oder fehlt dort ein Teil? Wenn sie ohne Probleme zu öffnen sind, dann liegt es ja irgendwie an dem Vergleich der Größen. Ansonsten wird es wohl an der Download-Prozedur liegen. Das kann man aber aus den geposteten Code auch nicht sehen.
Marko
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 01.01.11 19:19 
Nein, das Problem ist noch nicht gelöst ;-).
Hab da wohl versehentlich draufgeklickt *peinlich*

Datei lässt sich Problemlos öffnen. Da es ne .exe install datei ist von einen mappack hab ichs direkt getestet:

Keine Fehler, Alles in Ordnung.


Anbei der Code, der den Download ausführt:

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:
53:
54:
55:
56:
57:
58:
59:
60:
  private void DoDownload(object CMD) {
             string[] cm = CMD.ToString().Split(';');
             string MyUrl = cm[0];
             string SaveAs = cm[1];
             int hash = Convert.ToInt32(cm[2]);
             int index = GetGridIndex(hash.ToString());
             string Token = cm[3];
             using (WebClient wcDownload = new WebClient())
             {
            
                 try
         {
                     webRequest = (HttpWebRequest)WebRequest.Create(MyUrl);
               
                     webRequest.Credentials = CredentialCache.DefaultCredentials;
           

                     using (webResponse = (HttpWebResponse)webRequest.GetResponse())
                     {
                         if (webResponse.StatusCode == HttpStatusCode.OK)
                         {



                        
                             Int64 fileSize = webResponse.ContentLength;

                 
                             Stream strResponse = wcDownload.OpenRead(MyUrl);
             
                              FileStream strLocal = new FileStream(SaveAs, FileMode.Create, FileAccess.Write, FileShare.None);

                             
                             int bytesSize = 0;
                   
                             byte[] downBuffer = new byte[2048];
 
                             while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                             {
                     
                                 strLocal.Write(downBuffer, 0, bytesSize);
                         
                                 FileInfo Fi = new FileInfo(SaveAs);

                                // MyDownloads.ExecuteThreadSafe(() => MyDownloads.Rows[index].Cells[3].Value = PercentProgress.ToString() + "%");
                                          }
                       
                         }

                     }
                 }
                 finally {

                     
                    
                 
                 }
             }
         
         }


EDIT:
Die Dateigröße von Server empfang ich so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 webRequest = (HttpWebRequest)WebRequest.Create("http://urlistgeheim.uk/session.php?action=downloadfile&s=" + Token);
                  
                    webRequest.Credentials = CredentialCache.DefaultCredentials;
                    webResponse = (HttpWebResponse)webRequest.GetResponse();


                   long dlsize = webResponse.ContentLength;
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 01.01.11 19:47 
Auch von mir: :welcome: !

user profile iconMaldö hat folgendes geschrieben Zum zitierten Posting springen:
Nein, das Problem ist noch nicht gelöst ;-).
Hab da wohl versehentlich draufgeklickt *peinlich*
Das kannst du immer noch korrigieren.
user profile iconMaldö hat folgendes geschrieben Zum zitierten Posting springen:
Aber jetz kommt es... im code steht erst wenn BytesOnDisk == BytesOnServer ist soll er die Datei ausm Temp Verzeichnis ins richtige kopieren.

Nach etwa 5 Minuten warte Zeit bei Prozent 99 macht er das auch. Datei ist aber dennoch kleiner als Auf dem Server (Byte vergleich).
Naja, dann musst du dich bei einem von beiden wohl geirrt haben. Da du den Screenshot vergessen hast, lässt sich da von unserer Seite aus wenig beurteilen. Aber dass die Exe startbar ist, spricht schon sehr dafür, dass sie fehlerlos übertragen wurde.

_________________
>λ=
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 01.01.11 20:09 
Danke fürs Welcome :-)

Hier die Screenis ;)


Moderiert von user profile iconKha: Bilder angehängt.
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 01.01.11 20:17 
Wie soll da jemals die richtige Byte-Zahl stehen, wenn du sie nur für < 100% dort hinschreibst ;) ? Ich dachte, du hättest im Explorer nachgeschaut.

_________________
>λ=
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 01.01.11 20:26 
Wäre ganz schön, wenn Du die Screenshots hier direkt hochlädst, so dass man diese direkt sieht. Aber so sehr viel sieht man darauf auch nicht. Bist Du Dir sicher, dass der Server bzw. das php-Script die korrekte ContentLength schickt? Du kannst ja mal folgendes probieren:
Lade einfach mal eine Datei runter und speicher sie lokal. Und dann schaue mal, was der Server für eine Size zurückliefert, und vergleiche die beiden Grössen. Wenn sie gleich sind, dann liegt der Fehler irgendwo im Code (die Frage ist dann nur, wo genau), ansonsten eben am php-Script.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://urlistgeheim.uk/session.php?action=downloadfile&s=FILE");
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
long dlsize = webResponse.ContentLength;
webResponse.Close();

FileInfo fi = new FileInfo("c:\\temp\\FILE");
long fileSize = fi.Length;
if (fileSize == dlsize)

                            
}

Marko
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 01.01.11 20:47 
Danke euch beiden.

Habe die Datei selber hochgeladen gehabt:

Bytezahl: 19.904.832;
Respone Server: 19.904.832;
Temp Verzeichnis: 19.902.464;


Kurz vor Ende kommt jedoch der Aufschub von 2kb/s und die Datei >stimmt<.
Jedoch erst nach einer Pause von etwa 1-2 Minuten.

Diese Frage ist für mich noch ungeklärt und ich hab keine Ahnung woran es liegen kann.
Auf dem ersten Blick würd ich sagen, irgendwas block den Download kurz und gibt ihn dann wieder frei.

Ich hatte erst Norton im Visier, doch selbst nach Deaktivierung bleibts sich gleich.

Hätte die Dateien gleich im Explorer vergleichen sollen *selbsthau*.

Nun hätte da jemand eine Idee oder ist so normal beim Webclienten?
Einloggen, um Attachments anzusehen!
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 02.01.11 03:46 
Habe das Problem gelöst:

Undzwar so:

ich benutze den download, die size anfrage und das generiern der dl session per request.

Request->Respone, weiß jeder.
Der eigentliche Download jedoch ist in einen using(...){ try{...

In der Sparte: finally{...}
habe ich die Websrespone geschlossen.
das selbe hab ich mit der Size Anfrage gemacht.

Hier kleiner Ausschnitt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//Vorher:
  webResponse = (HttpWebResponse)webRequest.GetResponse();


  long dlsize = webResponse.ContentLength;
//Nachher:
                    webResponse = (HttpWebResponse)webRequest.GetResponse();


                    long dlsize = webResponse.ContentLength;
                    webResponse.Close();


Beim Download siehe bei Finally:

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:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
 private void DoDownload(object CMD)
        {
            string[] cm = CMD.ToString().Split(';');
            string MyUrl = cm[0];
            string SaveAs = cm[1];
            int hash = Convert.ToInt32(cm[2]);
            int index = GetGridIndex(hash.ToString());
            string Token = cm[3];
            using (WebClient wcDownload = new WebClient())
            {
                 try
                {
             
                    // Create a request to the file we are downloading
                    webRequest = (HttpWebRequest)WebRequest.Create(MyUrl);
                   
                    // Set default authentication for retrieving the file
                    webRequest.Credentials = CredentialCache.DefaultCredentials;
                    // Retrieve the response from the server

                    using (webResponse = (HttpWebResponse)webRequest.GetResponse())
                    {
                        if (webResponse.StatusCode == HttpStatusCode.OK)
                        {



                            // Ask the server for the file size and store it
                            Int64 fileSize = webResponse.ContentLength;

                            // Open the URL for download
                         
                            Stream strResponse = wcDownload.OpenRead(MyUrl);
                            
                            // Create a new file stream where we will be saving the data (local drive)
                            FileStream strLocal = new FileStream(SaveAs, FileMode.Create, FileAccess.Write, FileShare.None);

                            // It will store the current number of bytes we retrieved from the server
                            int bytesSize = 0;
                            // A buffer for storing and writing the data retrieved from the server
                            byte[] downBuffer = new byte[2048];

                            // Loop through the buffer until the buffer is empty
                            while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                            {
                                // Write the data from the buffer to the local hard drive
                                strLocal.Write(downBuffer, 0, bytesSize);
                                // Invoke the method that updates the form's label and progress bar
                                FileInfo Fi = new FileInfo(SaveAs);

                                // MyDownloads.ExecuteThreadSafe(() => MyDownloads.Rows[index].Cells[3].Value = PercentProgress.ToString() + "%");
                            }

                        }

                    }
                }
                finally
                {

                    webResponse.Close();
                    


                }
            }

        }


Danke an alle die mir geholfen haben :-)[/cs]