2010-11-21 13 views
2

Ich wollte vor kurzem den Fortschritt eines HTTPWebRequest Upload-Fortschritts verfolgen. Also fing ich klein an und begann mit dem gepufferten Lesen einer einfachen Textdatei. Ich entdeckte dann, dass eine einfache Aufgabe wieLesen (Schreiben) von Dateien in C#

File.ReadAllText("text.txt"); 

so etwas wie unten wird, mit allen Strömen, Leser, Autoren etc. Oder kann Somethings entfernt werden? Auch der folgende Code funktioniert nicht. Vielleicht habe ich etwas falsch gemacht, was ist der Weg zu lesen (ich denke, schreiben wird ähnlich sein) in Puffer, so dass ich den Fortschritt verfolgen kann, unter der Annahme, dass der Strom nicht lokal sind z. 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(); 

Update: Lösung

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

"Auch der folgende Code funktioniert nicht." - Wie wäre es, sich selbst zu helfen und zu erklären, was nicht wie erwartet funktioniert ...? –

+0

@Mitch Wheat, oh ich habe vergessen, den Fehler hinzuzufügen, habe ich den Beitrag aktualisiert. Ich bekomme den Fehler auf der 'while' Zeile –

Antwort

0

wahrscheinlich

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

Ich denke, es gab auch eine' BinaryWriter.Write (byte []) 'http://goo.gl/or9lO –

+0

Auch, warum ist' Offset' 0? sollte es stattdessen 'bytesRead' sein? sonst durch die Schleife, überschreibt es geschriebene Daten? –

+0

Oh, vielleicht hast du gemeint, 'inStream.Read (buffer, 0, buffer.length)'? cos das behebt das Problem –

0

werden sollte, da Sie scheinen Text zu lesen (obwohl ich falsch könnte), so scheint es, dass Ihr Programm könnte viel einfacher sein, wenn Sie Zeichen für Zeichen lesen anstatt den Standard zu lesen():

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

Da Sie nur den Fortschritt des Hochladevorgangs überprüfen müssen, können Sie die Größe der Datei mit einem fileinfo-Objekt überprüfen.

In der FileInfo-Klasse gibt es eine Eigenschaft namens length, die die Dateigröße in Byte zurückgibt. Nicht sicher, ob es die aktuelle Größe angibt, wenn die Datei geschrieben wird. Aber ich denke, es ist einen Versuch wert, da es einfacher und effizienter als die Methode ist, die Sie verwenden