2009-12-02 26 views
6

Đã cố gắng viết một chương trình trong C# tải xuống tệp bằng nhiều phân đoạn cùng một lúc như hầu hết các trình quản lý tải xuống và tôi đã gặp phải sự cố tệp tải xuống bị hỏng. Ví dụ: tôi tải video xuống và phát trong 2 giây thì WMP cho biết không thể phát được.Trình tải xuống tệp C# được phân đoạn

Tôi đã hexed tệp đã tải xuống và có vẻ như có các phần của zerobytes nằm rải rác trong tệp, bất kỳ ai có bất kỳ ý tưởng nào tại sao? VS báo cáo không có lỗi.

getPart() được gọi cho từng phân đoạn trong một chuỗi riêng biệt.

public long start; 
public long end; 
public int thread; 
public Form1 handle; 
public myFile handler; 
public void getPart() 
{ 
    log("getting part " + start.ToString() + "," + end.ToString()); 
    HttpWebRequest part = (HttpWebRequest)WebRequest.Create(handler.url); 
    part.AddRange((int)start,(int) end); 
    HttpWebResponse pr = (HttpWebResponse)part.GetResponse(); 
    Stream rstream = pr.GetResponseStream(); 
    log("Beginning part " + start.ToString()); 
    int totalbytes = 0; 
    byte[] buffer = new byte[256]; 
    int x = rstream.Read(buffer, 0, 256); 
    while (x > 0) 
    { 
     handler.writeFile(buffer, (int)(totalbytes + start), x); 
     totalbytes += x; 
     x = rstream.Read(buffer, 0, 256); 
    } 
    log(start.ToString() + "-byte start part done..."); 
    rstream.Close(); 
    pr.Close(); 
    handler.partDone(thread); 
    return; 
} 

public void writeFile(byte[] buffer, int start, int size) 
{ 
    mFileStream.Seek(start, SeekOrigin.Begin); 
    mFileStream.Write(buffer, 0, size); 
    return; 
} 

Trả lời

10

Tôi đã tìm ra, chỉ nghĩ rằng tôi sẽ để lại câu trả lời cho bất kỳ ai có vấn đề tương tự. Yêu cầu khóa xung quanh luồng ghi tệp.

public void writeFile(byte[] buffer, int start, int size) 
    { 
     mFileStream.Seek(start, SeekOrigin.Begin); 
     mFileStream.Write(buffer, 0, size); 
     return; 
    } 

trở thành

public void writeFile(byte[] buffer, int start, int size) 
    { 
     lock (mFileStream) 
     { 
     mFileStream.Seek(start, SeekOrigin.Begin); 
     mFileStream.Write(buffer, 0, size); 
     return; 
     } 
    } 
+0

cảm ơn bạn, chỉ cần tự hỏi, các tải không phải là song song, phải không? – ikel

Các vấn đề liên quan