2010-10-13 21 views
1

Je transfère un fichier sur un NetworkStream et il semble que lorsque le fichier dépasse 5-10k, le fichier commence à manquer des données et/ou a d'énormes espaces vides .De plus grandes tailles de fichiers sont incorrectement transférées avec un NetworkStream

Voici ce que j'ai:

private string ReadandSaveFileFromServer(TcpClient clientATF, NetworkStream currentStream, string locationToSave) 
{ 
    int fileSize = 0; 
    string fileName = ""; 
    int bytesRead = 0; 

    fileName = ReadStringFromServer(clientATF, currentStream); 
    fileSize = ReadIntFromServer(clientATF, currentStream); 

    FileStream fs = new FileStream(locationToSave + "\\" + fileName, FileMode.Create); 

    byte[] fileSent = new byte[fileSize]; 

    while (currentStream.DataAvailable) 
    { 
     if (clientATF.Connected) 
     { 
      bytesRead = currentStream.Read(fileSent, 0, fileSent.Length); 
      fs.Write(fileSent, 0, fileSent.Length); 
     } 
     else 
     { 
      break; 
     } 
    } 

    fs.Flush(); 
    fs.Close(); 

    return fileName; 
} 

Répondre

0

Voici la réponse. L'erreur fs.Write() était un oubli de ma part. Merci à tous pour l'aide.

private string ReadandSaveFileFromServer(TcpClient clientATF, NetworkStream currentStream, string locationToSave) 
    { 
     int fileSize = 0; 
     string fileName = ""; 
     int bytesRead = 0; 

     fileName = ReadStringFromServer(clientATF, currentStream); 
     fileSize = ReadIntFromServer(clientATF, currentStream); 

     FileStream fs = new FileStream(locationToSave + "\\" + fileName, FileMode.Create); 

     byte[] fileSent = new byte[fileSize]; 

     while (fs.Length != fileSize) 
     { 

       bytesRead = currentStream.Read(fileSent, 0, fileSent.Length); 
       fs.Write(fileSent, 0, bytesRead); 

     } 

     fs.Flush(); 
     fs.Close(); 

     return fileName; 
    } 
2

Non, vous avez écrit votre code tampon erroné. À un premier coup d'œil, je vous recommande de changer à fs.Write(fileSetn, 0, bytesRead) à la place.

2

Voici le problème: fs.Write(fileSent, 0, fileSent.Length);

vous écrivez fileSent.Length octets de fichier pendant que vous venez de recevoir bytesRead octets.

code corrigé:

fs.Write(fileSent, 0, bytesRead); 
+1

Un autre point: si vous êtes déconnecté après cette ligne de code: if (clientATF.Connected) Ensuite, vous obtenez une exception lorsque vous essayez de lire le flux. Je recommande de le mettre dans un essai/catch – Xaqron

+0

Il n'a pas cette ligne de code, et si le pair a fait une fermeture ordonnée, il ne reçoit pas d'exception du tout. Qu'est-ce que tu racontes? – EJP

+0

La vérification de l'homologue est connectée ou non est une méthode async par conception et sur return() lorsqu'il essaie de lire le flux, une exception déclencherait toute lecture/écriture sur un flux [bytesRead = currentStream.Read (fileSent, 0, fileSent .Longueur); ] dont nous ne sommes pas sûrs (sur d'autres machines par exemple) doivent être utilisés avec précaution. – Xaqron

0

Débarrassez-vous de l'essai disponible et lu jusqu'à ce que vous obtenez EOS. C'est un abus de disponible.