2010-11-21 9 views
2

최근 진행 상황을 추적하고 싶습니다. HTTPWebRequest 업로드 진행률. 그래서 저는 작게 시작하여 간단한 텍스트 파일을 버퍼링하여 읽기 시작했습니다. 그때C에서 파일 읽기 (/ 쓰기)

File.ReadAllText("text.txt"); 

같은 간단한 작업 등 모든 스트림, 독자, 작가로, 아래 같은 지거나 일도 제거 할 수 있다는 것을 발견? 또한 아래 코드는 작동하지 않습니다. 어쩌면 내가 뭔가 잘못 했어, 내가 읽을 수있는 방법 (내가 쓰는 것 같아. 비슷한 것 같다) 버퍼에 그래서 내가 진행 상황을 추적 할 수있는, 스트림이 로컬하지 가정합니다.

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(); 

WebRequest 클래스 업데이트 : 텍스트를 (내가 틀릴 수도 있지만) 읽는 것 같다 때문에 솔루션

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

"아래 코드도 작동하지 않습니다." - 자신을 돕고 예상대로 작동하지 않는 것을 설명하는 방법에 대해 ...? –

+0

@Mitch 밀, 아 오류를 추가하는 것을 잊어 버렸습니다. 게시물을 업데이트했습니다. 'while' 줄에 오류가 발생했습니다. –

답변

0

아마

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

BinaryWriter.Write (byte []) http://goo.gl/or9lO –

+0

도 있습니다. 왜 'offset'이 0입니까? 대신'bytesRead' 여야합니까? 그렇지 않으면 루프가 끝나고 쓰여진 데이터를 덮어 씁니까? –

+0

어쩌면 당신은'inStream.Read (buffer, 0, buffer.length)'를 의미할까요? 왜냐하면이 문제를 해결했기 때문이다. –

0

을해야한다, 당신의 프로그램이 보인다 표준 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

업로드 작업의 진행 상황을 확인하기 만하면 fileinfo 개체를 사용하여 파일 크기를 확인할 수 있습니다.

FileInfo 클래스에서 파일 크기를 바이트 단위로 반환하는 length라는 속성이 있습니다. 파일이 쓰여질 때 현재 크기를 제공하는지 확실하지 않습니다. 그러나 사용하는 방법보다 더 간단하고 효율적이므로 시험해 볼 가치가 있다고 생각합니다.