Сегментированный C # загрузчик файлов - PullRequest
7 голосов
/ 02 декабря 2009

Я пытался написать программу на 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 Ответ

11 голосов
/ 03 декабря 2009

Ну, я понял это, просто подумал, что оставлю ответ для тех, у кого есть подобные проблемы. Требуется блокировка для потока записи файла.

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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...