none
Mein Webrequest download geht niiiiicht ;( RRS feed

  • Frage

  • hey Leute !

    Ich will eine Datei per Webrequest downloaden. Der Link zur Datei :

    http://bdg.pf-control.de/Maps/11.txt

    Naja, also das mache ich mit einer Methode die so aussieht :

     public static int DownloadFile(String remoteFilename, String localFilename)
            {
                int bytesProcessed = 0;
    
                Stream remoteStream = null;
                Stream localStream = null;
                WebResponse response = null;
    
                try
                {
                    WebRequest request = WebRequest.Create(remoteFilename);
                    if (request != null)
                    {
                        response = request.GetResponse();
                        if (response != null)
                        {
    
                            remoteStream = response.GetResponseStream();
    
                            localStream = File.Create(localFilename);
    
                            byte[] buffer = new byte[1024];
                            int bytesRead;
    
                            do
                            {
                                bytesRead = remoteStream.Read(buffer, 0, buffer.Length);
    
                                localStream.Write(buffer, 0, bytesRead);
    
                                bytesProcessed += bytesRead;
                            } while (bytesRead > 0);
                        }
                    }
                }
                catch (Exception e)
                {
                    System.Console.WriteLine(e.Message);
                }
                finally
                {
                    if (response != null) response.Close();
                    if (remoteStream != null) remoteStream.Close();
                    if (localStream != null) localStream.Close();
                }
    
                return bytesProcessed;
            }

    jedenfalls, habe ich mit dem brakpoint geprüft, ob der path wo das hin soll richtig ist (C:\Users\...\Documents\BDG-productions\Maps\) Und der Link...

    Aber da kommt keine Datei in dem Maps Ordner an ! (Ja, der Ordner existiert)...
    Woran kann das liegen ? 

    Danke für eure Hilfe !

    Sonntag, 24. Juni 2012 10:13

Antworten

  • Habs rausgefunden !

    Bei localFileName dachte ich muss man nur den Ordner angeben, wos reinkommen soll, und das übernimmt dann den alten name, aber man muss anscheinend auchnoch den neuen Name da mitgeben ...

    Danke für eure Hilfe !

    Die Methode StramToFile werde ich trotzdem weiter benutzen ;D

    • Als Antwort markiert Basti1 Sonntag, 24. Juni 2012 13:22
    Sonntag, 24. Juni 2012 13:21

Alle Antworten

  • Stream implementiert IDisposable, daher würde ich den Code umschreiben, benutze eine Funktion wie diese hier zum speichern. Gleiches gilt auch für WebResponse:

                try
                {
                    WebRequest request = WebRequest.Create(remoteFilename);
                    using (WebResponse response = request.GetResponse())
                    {
                        using (Stream remoteStream = response.GetResponseStream())
                        {
                            StreamToFile(remoteStream, localFilename, FileMode.Create);
                        }
                    }
                }
                catch (Exception e)
                {
                    System.Console.WriteLine(e.Message);
                }

    Sonntag, 24. Juni 2012 11:41
  • Er gibt auch nichts aus...

    while ((cnt = inputStream.Read(buffer, 0, LEN)) != 0)
                        outputStream.Write(buffer, 0, cnt);

    Das hier wird garnicht ausgeführt ^^...
    Aber die Werte stimmen eig.

    Eine Frage : Das wie ich das vorher gemacht hatte, das hab ich ja ausm Internet, aber warum ist das eigentlich ein int ? sollte das nicht soeine void sein ?

    (Aber die andere Frage ist wichtiger ! :D)

    MfG, Ich

    Sonntag, 24. Juni 2012 12:26
  • Habs rausgefunden !

    Bei localFileName dachte ich muss man nur den Ordner angeben, wos reinkommen soll, und das übernimmt dann den alten name, aber man muss anscheinend auchnoch den neuen Name da mitgeben ...

    Danke für eure Hilfe !

    Die Methode StramToFile werde ich trotzdem weiter benutzen ;D

    • Als Antwort markiert Basti1 Sonntag, 24. Juni 2012 13:22
    Sonntag, 24. Juni 2012 13:21
  • Bei mir funktionierts einwandfrei. Was ist ein Int? Deine DownloadFile-Methode? Kannst du so umschreiben:

            static void Main(string[] args)
            {
                string Url = "http://social.msdn.microsoft.com/Forums/en-US/visualcsharpde/thread/3658875b-7b67-42ba-bf2b-98d1941d3c74";
                Console.WriteLine("Bytes read: {0}", DownloadFile(Url, @"C:\Temp\Test.txt"));
                Console.ReadLine();
            }
    
            private static long StreamToFile(Stream inputStream, string outputFile, FileMode fileMode)
            {
                if (inputStream == null)
                    throw new ArgumentNullException("inputStream");
    
                if (String.IsNullOrEmpty(outputFile))
                    throw new ArgumentException("Argument null or empty.", "outputFile");
    
                using (FileStream outputStream = new FileStream(outputFile, fileMode, FileAccess.Write))
                {
                    int cnt = 0;
                    const int LEN = 4096;
                    byte[] buffer = new byte[LEN];
    
                    while ((cnt = inputStream.Read(buffer, 0, LEN)) != 0)
                        outputStream.Write(buffer, 0, cnt);
                    outputStream.Seek(0, SeekOrigin.End);
                    return outputStream.Position;
                }
            }
    
            public static long DownloadFile(String remoteFilename, String localFilename)
            {
                long bytes = -1;
                try
                {
                    WebRequest request = WebRequest.Create(remoteFilename);
                    using (WebResponse response = request.GetResponse())
                    {
                        using (Stream remoteStream = response.GetResponseStream())
                        {
                            bytes = StreamToFile(remoteStream, localFilename, FileMode.Create);
                        }
                    }
                }
                catch (Exception e)
                {
                    System.Console.WriteLine(e.Message);
                }
    
                return bytes;
            }

    Sonntag, 24. Juni 2012 13:24
  • Jetzt isis ein long...

    Ich war irgendwie gewohnt, das es heißt public void() ... Ich wusste nicht das man sowas mit longs und ints und allen Variablen machen kann ^^

    Sonntag, 24. Juni 2012 13:26
  • Eine vereinfachte Methodesignatur sieht so aus: [Zugriffsmodifizierer] Rückgabetype Methodenname([Parameter])

    Wobei void bedeuted, das die Methode keinen Wert zurück gibt. Jeder andere Typangabe macht eine Methode praktisch zur Funktion.

    Sonntag, 24. Juni 2012 14:28