2009-12-02 13 views
6

ほとんどのダウンロードマネージャのように複数のセグメントを同時に使用してファイルをダウンロードするプログラムをC#で作成しようとしましたが、ダウンロードしたファイルが破損しているという問題が発生しました。たとえば、ビデオをダウンロードして2秒間再生した後、WMPは再生できないと言います。セグメント化されたC#ファイルダウンローダ

私がダウンロードしたファイルをhexeditedし、それがファイルに散らばっzerobytesのセクションがあります表示され、誰もがなぜ任意のアイデアがありますか? VSはエラーを報告しません。

getPart()は、別のスレッド内の各セグメントに対して呼び出されます。

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; 
} 

答えて

10

まあ、私はちょうど私が同様の問題を持つ人のための答えを残すだろうと思って、それを考え出しました。ファイル書き込みストリームの周りにロックが必要です。

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

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

はただ不思議、ありがとうとなり、ダウンロードが右、並列ではないでしょうか? – ikel