2 votes

Convertir un MemoryStream en FileStream crée des centaines de fichiers identiques ?

J'accède à une requête httpwebrequest qui renvoie un fichier pdf comme réponse. Je lis cette réponse dans un flux de mémoire, puis je la convertis en fichier. Le problème est que des centaines de fichiers sont créés. Je ne sais pas trop pourquoi, j'ai essayé plusieurs méthodes, et toutes font la même chose... Voici la première méthode qui renvoie le flux de mémoire.

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

Deuxièmement, convertir en FileStream...

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.CreateNew);
            fs.Write(data, 0, data.Length);

Des idées ?

ÉDITER POUR AJOUTER PLUS DE CODE...

    public MemoryStream GetToStream()
    {
        if (_Req == null)
            throw new Exception("HttpWebRequest is not initialised");

        GetResult(_Req);

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

        _ResponseStream.Close();

        if (memStream.Length > 0)
            return memStream;
        else return null;
    }

newFile est le chemin d'accès au serveur du fichier à créer.

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.Create);
            fs.Write(data, 0, data.Length);
            fs.Close();

J'ai essayé stream.WriteTo(fs), et la même chose se produit. C'est assez bizarre.

13voto

Jon Skeet Points 692016

La raison pour laquelle vous obtenez plusieurs fichiers n'est pas claire, mais vous devriez pouvoir obtenir certains sur la base des noms de fichiers - chacun d'entre eux correspondrait à une valeur de newFile .

Je constate d'ailleurs que vous ne fermez pas votre flux de fichiers. L'utilisation de File.WriteAllBytes est un moyen beaucoup plus simple d'atteindre votre objectif et ne vous oblige pas à fermer quoi que ce soit :

byte[] data = stream.ToArray();
File.WriteAllBytes(newFile, data);

Une autre solution consiste à utiliser un FileStream (avec un using ) mais utiliser MemoryStream.WriteTo pour éviter l'appel à ToArray qui doit copier toutes les données :

using (FileStream fs = File.Create(newFile))
{
    stream.WriteTo(fs);
}

0voto

krosenvold Points 35979

Je pense que vous recevez plus de demandes de la part de vos clients que vous ne le pensez. Vérifiez le fichier journal d'accès de votre serveur web. Les extraits de code que vous montrez semblent raisonnables, mais ne montrent pas suffisamment de code pour expliquer le problème - vous ne montrez pas la bonne partie du code. Quoi qu'il en soit, vérifiez le journal d'accès ou utilisez une sorte de traçage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X