分段式C#文件下载器

7

我一直在尝试使用C#编写一个程序,像大多数下载管理器一样使用多个片段同时下载文件,但是我遇到了一个问题,下载的文件损坏了。例如,我下载了一个视频,它播放了2秒钟,然后WMP说无法播放。

我用十六进制编辑器检查了下载的文件,发现有零字节散布在整个文件中,请问有什么想法吗?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;
}
1个回答

12

好了,我搞清楚了。我觉得我应该留下一个答案,以便于其他出现类似问题的人参考。在文件写入流周围需要加锁。

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

谢谢,只是想知道,下载不是并行的,对吗? - ikel
我猜不是,startend在方法之外。有了这个,您可以在下载时播放视频。 - ewwink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接