mercredi 22 avril 2015

How to split file into parts and download c#

I'm working on a split downloader for c#. It is downloading fine (so the logic is working) but the problem is that whatever file it downloads it corrupts. I have no idea on how to fix it. Heres the code:

private void mergeClean()
    {
        const int chunkSize = 1 * 1024; // 2KB
        using (var output = File.Create("output.jpg"))
        {
            foreach (var file in Files)
            {
                using (var input = File.OpenRead(file))
                {
                    var buffer = new byte[chunkSize];
                    int bytesRead;
                    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        output.Write(buffer, 0, bytesRead);
                    }
                }
            }
        }

        foreach (var file in Files)
        {
            File.Delete(file);
        }
    }

    private void SaveFileStream(String path, Stream stream)
    {
        var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
        stream.CopyTo(fileStream);
        fileStream.Dispose();
    }

    public void SplitDownload(string URL)
    {
        System.Net.WebRequest req = System.Net.HttpWebRequest.Create(URL);
        req.Method = "HEAD";
        System.Net.WebResponse resp = req.GetResponse();
        var responseLength = double.Parse(resp.Headers.Get("Content-Length"));
        var partSize = Math.Ceiling(responseLength / 10);
        var previous = 0;

        for (int i = (int)partSize; i <= responseLength; i = i + (int)partSize)
        {
            Thread t = new Thread(() => Download(URL, previous, i));
            t.Start();
            t.Join();
            previous = i;
        }

        mergeClean();
    }

    private void Download(string URL, int Start, int End)
    {
        Console.WriteLine(String.Format("{0},{1}", Start, End));

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
        myHttpWebRequest.AddRange(Start, End);
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        Stream streamResponse = myHttpWebResponse.GetResponseStream();
        String name = GenerateTempName();
        SaveFileStream(name, streamResponse);
        Files.Add(name);
    }

Here is an example of what it does:

Original Downloaded




Aucun commentaire:

Enregistrer un commentaire