1: using System;
2: using System.Net;
3: using System.IO;
4:
5: namespace RestartableDownload
6: {
7: internal class RestartableDownload
8: {
9: private Uri _uri;
10: private string _destFile;
11: private FileStream _writeStream;
12: private Stream _readStream;
13:
14: internal RestartableDownload(string uri, string destinationFile)
15: {
16: _uri = new Uri(uri);
17: _destFile = destinationFile;
18: }
19:
20: internal void StartDownload()
21: {
22: if (_uri.Scheme.Equals("http"))
23: {
24: try
25: {
26: long start = OpenWriteStream();
27: long length = GetContentLength();
28: if (start < length)
29: {
30: OpenReadStream(start, length);
31: Copy();
32: }
33: }
34: catch (System.Exception ex)
35: {
36: Console.WriteLine(ex.ToString());
37: }
38: finally
39: {
40: if (_writeStream != null)
41: _writeStream.Close();
42: if (_readStream != null)
43: _readStream.Close();
44: }
45: }
46: }
47:
48: private long OpenWriteStream()
49: {
50: _writeStream = new FileStream(_destFile, FileMode.Append, FileAccess.Write);
51: return _writeStream.Length;
52: }
53:
54: private long GetContentLength()
55: {
56: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_uri);
57: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
58: long length = response.ContentLength;
59: response.Close();
60: return length;
61: }
62:
63: private void OpenReadStream(long start, long length)
64: {
65: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_uri);
66: request.AddRange((int)start, (int)length);
67: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
68: if (response.ContentLength == length)
69: {
70: _writeStream.Seek(0, SeekOrigin.Begin);
71: }
72: _readStream = response.GetResponseStream();
73: }
74:
75: private void Copy()
76: {
77: byte[] buffer = new byte[1024];
78: int count = _readStream.Read(buffer, 0, buffer.Length);
79: while (count > 0)
80: {
81: _writeStream.Write(buffer, 0, count);
82: _writeStream.Flush();
83: count = _readStream.Read(buffer, 0, buffer.Length);
84: }
85: }
86: }
87:
88: class Program
89: {
90: static void Main(string[] args)
91: {
92: string uri = @"http://download.microsoft.com/download/7/0/3/" +
93: "703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe";
94: string output = @"downloaded-dotNetFx35setup.exe";
95:
96: RestartableDownload download = new RestartableDownload(uri, output);
97: download.StartDownload();
98: }
99: }
100: }