2009-12-02 17 views
6

सी # में एक प्रोग्राम लिखने की कोशिश कर रहा है जो कई डाउनलोड प्रबंधकों की तरह एक से अधिक सेगमेंट का उपयोग कर फ़ाइल डाउनलोड करता है, और मैंने इस समस्या में भाग लिया है कि डाउनलोड की गई फाइलें दूषित हैं। उदाहरण के लिए, मैं एक वीडियो डाउनलोड करता हूं और यह 2 सेकंड के लिए खेलता है तो डब्लूएमपी का कहना है कि यह नामुमकिन है।सेगमेंट सी # फ़ाइल डाउनलोडर

मैंने डाउनलोड की गई फ़ाइल को हेक्सेट किया और ऐसा लगता है कि फ़ाइल भर में बिखरे हुए ज़ीरोबाइट्स के अनुभाग हैं, किसी के पास कोई विचार है क्यों? वीएस में कोई त्रुटि नहीं है।

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

संबंधित मुद्दे