2009-12-02 22 views
6

He intentado escribir un programa en C# que descarga un archivo usando varios segmentos a la vez como la mayoría de los administradores de descargas, y me he encontrado con el problema de que los archivos descargados están dañados. Por ejemplo, descargué un video y se reproduce durante 2 segundos, luego WMP dice que no se puede reproducir.Descargador de archivos C# dividido en segmentos

He hexeditado el archivo descargado y parece que hay secciones de cero bytes dispersos en todo el archivo, ¿alguien tiene alguna idea de por qué? VS informa que no hay errores.

getPart() se llama para cada segmento en una secuencia separada.

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

Respuesta

10

Bueno, yo he averiguado, sólo pensé en dejar una respuesta para cualquier persona que tenga problemas similares. Se requiere un bloqueo alrededor de la secuencia de escritura de archivos.

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

convierte

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

gracias, pregunto, la descarga no está en paralelo, ¿verdad? – ikel

Cuestiones relacionadas