2010-11-21 6 views
2

Je voulais récemment suivre les progrès d'un HTTPWebRequest télécharger des progrès. J'ai donc commencé petit et commencé avec la lecture tamponnée d'un simple fichier texte. J'ai découvert alors qu'une tâche simple commeLire (/ écrire) des fichiers en C#

File.ReadAllText("text.txt"); 

devient quelque chose comme ci-dessous, tous les cours d'eau, lecteurs, écrivains, etc. Ou peut somethings être retiré? Aussi le code ci-dessous ne fonctionne pas. Peut-être que j'ai fait quelque chose de mal, quel est le moyen de lire (je suppose que l'écriture sera similaire) dans le tampon afin que je puisse suivre les progrès, en supposant que le flux ne sont pas locaux, par exemple. WebRequest

byte[] buffer = new byte[2560]; // 20KB Buffer, btw, how should I decide the buffer size? 
int bytesRead = 0, read = 0; 
FileStream inStream = new FileStream("./text.txt", FileMode.Open, FileAccess.Read); 
MemoryStream outStream = new MemoryStream(); 
BinaryWriter outWriter = new BinaryWriter(outStream); 

// I am getting "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection." 
// inStream.Length = Length = 9335092 
// bytesRead = 2560 
// buffer.Length = 2560 
while ((read = inStream.Read(buffer, bytesRead, buffer.Length)) > 0) 
{ 
    outWriter.Write(buffer); 
    //outStream.Write(buffer, bytesRead, buffer.Length); 
    bytesRead += read; 
    Debug.WriteLine("Progress: " + bytesRead/inStream.Length * 100 + "%"); 
} 
outWriter.Flush(); 

txtLog.Text = outStream.ToString(); 

Mise à jour: Solution

byte[] buffer = new byte[2560]; 
int bytesRead = 0, read = 0; 
FileStream inStream = File.OpenRead("text.txt"); 
MemoryStream outStream = new MemoryStream(); 

while ((read = inStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    outStream.Write(buffer, 0, buffer.Length); 
    bytesRead += read; 
    Debug.WriteLine((double)bytesRead/inStream.Length * 100); 
} 

inStream.Close(); 
outStream.Close(); 
+0

"Aussi le code ci-dessous ne fonctionne pas." - Que diriez-vous de vous aider et d'expliquer ce qui ne fonctionne pas comme prévu ...? –

+0

@Mitch Wheat, oh j'ai oublié d'ajouter l'erreur, j'ai mis à jour le poste. Je reçois l'erreur sur la ligne 'while' –

Répondre

0

devrait probablement être

outWriter.Write(buffer,0,read); 
+0

Je suppose qu'il y avait aussi un' BinaryWriter.Write (byte []) 'http://goo.gl/or9lO –

+0

Aussi, pourquoi est-ce que' offset' 0? devrait-il être 'bytesRead' à la place? Sinon, la boucle va écraser les données écrites? –

+0

Oh, peut-être que vous vouliez dire, 'inStream.Read (buffer, 0, buffer.length)'? car cela résout le problème –

0

Puisque vous semblez la lecture (bien que je peux me tromper), il semble que votre programme Cela pourrait être beaucoup plus simple si vous lisiez caractère par caractère au lieu d'appeler le standard Read():

BinaryReader reader = new BinaryReader(File.Open("./text.txt", FileMode.Open)); 
MemoryStream outStream = new MemoryStream(); 
StreamWriter outWriter = new StreamWriter(outStream); 

while (Reader.BaseStream.Position < Reader.BaseStream.Length) 
{ 
    outWriter.Write(reader.ReadChar()); 
    Debug.WriteLine("Progress: " + ((double)reader.BaseStream.Position)/(double)(reader.BaseStream.Length) + "%"); 
} 
outWriter.Close(); 
txtLog.Text = outStream.ToString(); 
0

Puisque vous avez seulement besoin de vérifier la progression de l'opération de téléchargement, vous pouvez simplement vérifier la taille du fichier en utilisant un objet fileinfo.

Dans la classe FileInfo, il existe une propriété appelée length qui renvoie la taille du fichier en octets. Je ne sais pas si cela donne la taille actuelle au moment de l'écriture du fichier. Mais je pense qu'il vaudra la peine d'essayer, car il est plus simple et efficace que la méthode que vous utilisez

Questions connexes