1
System.IO.Stream iStream = null;2

3
// Buffer to read 10K bytes in chunk:4
byte[] buffer = new Byte[10240];5

6
// Length of the file:7
int length;8

9
// Total bytes to read:10
long dataToRead;11

12
// Identify the file to download including its path.13
string filepath = @"E:\software\SQL Server 2000 Personal Edition.ISO";14

15
// Identify the file name.16
string filename = System.IO.Path.GetFileName(filepath);17

18
try19

{20
// Open the file.21
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 22
System.IO.FileAccess.Read,System.IO.FileShare.Read);23
Response.Clear();24

25
// Total bytes to read:26
dataToRead = iStream.Length;27

28
long p = 0;29
if(Request.Headers["Range"]!=null)30

{31
Response.StatusCode = 206;32
p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));33
}34
if(p != 0)35

{36
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString()); 37
}38
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());39
Response.ContentType = "application/octet-stream";40
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));41

42
iStream.Position = p;43
dataToRead = dataToRead - p;44
// Read the bytes.45
while (dataToRead > 0)46

{47
// Verify that the client is connected.48
if (Response.IsClientConnected) 49

{50
// Read the data in buffer.51
length = iStream.Read(buffer, 0, 10240);52

53
// Write the data to the current output stream.54
Response.OutputStream.Write(buffer, 0, length);55

56
// Flush the data to the HTML output.57
Response.Flush();58

59
buffer= new Byte[10240];60
dataToRead = dataToRead - length;61
}62
else63

{64
//prevent infinite loop if user disconnects65
dataToRead = -1;66
}67
}68
}69
catch (Exception ex) 70

{71
// Trap the error, if any.72
Response.Write("Error : " + ex.Message);73
}74
finally75

{76
if (iStream != null) 77

{78
//Close the file.79
iStream.Close();80
}81
Response.End();82
}