2009-02-17 9 views
2

J'accède à un httpwebrequest qui retourne un fichier pdf comme réponse. Je lis cette réponse dans un flux de mémoire, et plus tard sur la conversion dans un fichier. Le problème est, est que des centaines de fichiers sont en cours de création. Je ne sais pas pourquoi, j'ai essayé de nombreuses façons, et tous font la même chose ... C'est la première méthode qui retourne le flux de la mémoire.Convertir MemoryStream en FileStream crée des centaines de fichiers identiques?

 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ème à convertir en FileStream ...

  byte[] data = stream.ToArray(); 

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

Toutes les idées?

EDIT POUR AJOUTER PLUS 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 mappé sur le 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. Assez bizzare.

Répondre

13

Il est pas du tout pourquoi vous obtiendrez plusieurs fichiers, mais vous devriez être en mesure d'obtenir une des informations basées sur les noms de fichiers - chacun correspondrait à une valeur de newFile.

Je remarque que vous ne fermez pas votre flux de fichiers, d'ailleurs. L'utilisation 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 alternative est d'utiliser encore un FileStream (avec une déclaration 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); 
} 
0

Je suggère que vous recevez plus de demandes de votre client que vous ne le pensez. Vérifiez votre fichier journal d'accès au serveur Web. Les extraits de code que vous montrez semblent raisonnables, mais ne montrent pas vraiment assez 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.