IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Download FTP : System.OutOfMemoryException


Sujet :

Dotnet

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Points : 39
    Points
    39
    Par défaut Download FTP : System.OutOfMemoryException
    Bonjour,

    Lors du téléchargement d'un fichier de 400 Mo, mon programme lève une exception de type "System.OutOfMemoryException" En dessous de cette taille cela ne pose pas de problème.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     public void telechargerFichier(string fichier)
            {
                byte[] downloadedData;
                downloadedData = new byte[0];
                Stream reader = null;
                MemoryStream memStream = new MemoryStream();
                FtpWebResponse response = null;
     
                try
                {
     
                    FtpWebRequest request = FtpWebRequest.Create(url + "/" + fichier) as FtpWebRequest;
     
                    request.Credentials = new NetworkCredential("ftp", "");
                    request.UsePassive = true;
                    request.UseBinary = true;
                    request.KeepAlive = true;
     
                    request.Method = WebRequestMethods.Ftp.DownloadFile;
                    //Streams
                    response = request.GetResponse() as FtpWebResponse;
                    reader = response.GetResponseStream();
     
                    request = FtpWebRequest.Create(url + "/" + fichier) as FtpWebRequest;
                    request.Method = WebRequestMethods.Ftp.GetFileSize;
                    request.Credentials = new NetworkCredential("ftp", "");
                    request.UsePassive = true;
                    request.UseBinary = true;
                    request.KeepAlive = true; //don't close the connection
     
                    int dataLength = (int)request.GetResponse().ContentLength;
     
                    //Download to memory              
                    memStream = new MemoryStream();
                    byte[] buffer = new byte[1024]; //downloads in chuncks
     
                    while (true)
                    {
                        Application.DoEvents();
     
                        int bytesRead = reader.Read(buffer, 0, buffer.Length);
     
                        if (bytesRead == 0)
                        {
                            break;
                        }
                        else
                        {
                            //Write the downloaded data
                            memStream.Write(buffer, 0, bytesRead);
     
                        }
                    }
     
                    //Convert the downloaded stream to a byte array
                    downloadedData = memStream.ToArray();
     
                    Application.DoEvents();
                    //Enregistrement du fichier sur le disque
                    if (downloadedData != null && downloadedData.Length != 0)
                    {
                        //Write the bytes to a file
                        FileStream newFile = new FileStream(@"C:\FTP\" + fichier, FileMode.Create);
                        newFile.Write(downloadedData, 0, downloadedData.Length);
     
                    }
                    //Clean up
                    reader.Close();
                    memStream.Close();
                    response.Close();
     
                }
                catch (Exception e)
                {
     
                }
     
            }

    L'exception est levée sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     memStream.Write(buffer, 0, bytesRead);
    Quelqu'un a-t-il une idée sur la façon de procéder pour télécharger des gros fichiers via FTP en C# ?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    1/ Utilise la balise CODE du forum s'il te plait.
    2/ Essaye en n'utilisant plutôt un BufferedStream ou un FileStream

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Merci pour ta réponse.
    Non ça me fonctionne pas. Je ne l'utilise peut être pas bien. Peux-tu m'en dire un peu plus sur la façon de l'utiliser dans mon code ?

  4. #4
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu parles de BuffuredStream ? Il y a un bon exemple dans la MSDN, même couplé avec un NetworkStream.

    Par contre ce qui me surprend dans ton code, (outre le break dans un while(true)), c'est que tu lis un stream, le copy dans un tableau d'octet, pour le recopier dans un MemoryStream... pour ensuite l'écrire dans un FileStream !

    Pourquoi tant d'intermédiaires ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Oui je parlais de BufferedStream.
    Alors le code que j'ai utilisé provient d'une source internet qu'on retrouve systématiquelent pour le download en FTP.
    Mais je suis d'accord avec toi sur les étapes intermédiaires et j'ai du coup fait différemment et donc en transformant le stream en tableau de bytes puis en créant directement un filestream à partir de ce tableau (donc sans passer par un memory stream), ça marche très bien.
    Donc je pense que je vais faire comme ça.

    Merci.

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    Au cas où voici un paragraphe de la FAQ sur le FTP: http://dotnet.developpez.com/faq/asp...e=transfertftp. Le flux est écrit au fur et à mesure et c'est très très rapide.

    A+

  7. #7
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Le code me parait effectivement beaucoup plus efficace : lecture, écriture.
    Plus d'intermédiaires inutiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur 426 en download FTP
    Par thibaud dans le forum IIS
    Réponses: 0
    Dernier message: 18/04/2008, 12h49
  2. programme download FTP
    Par Babylonne dans le forum C++Builder
    Réponses: 1
    Dernier message: 31/08/2007, 18h48
  3. Réponses: 2
    Dernier message: 11/10/2006, 11h36
  4. [VB.net]system.outofmemoryexception
    Par grand_prophete dans le forum Windows Forms
    Réponses: 31
    Dernier message: 21/04/2006, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo