C#實現(xiàn)文件斷點續(xù)傳下載的方法
更新時間:2015年05月14日 12:09:23 作者:兩把刷子
這篇文章主要介紹了C#實現(xiàn)文件斷點續(xù)傳下載的方法,涉及網(wǎng)絡文件操作的相關技巧,非常具有實用價值,需要的朋友可以參考下
本文實例講述了C#實現(xiàn)文件斷點續(xù)傳下載的方法。分享給大家供大家參考。具體實現(xiàn)方法如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.IO;
using System.Text;
using System.Net;
namespace simpleDemo
{
class Program
{
/// <summary>
/// 下載文件保留字
/// </summary>
public static string PERSIST_EXP = ".cdel";
/// <summary>
public static void Main(string[] args)
{
string path = "D:\\aa.txt";
string ec = getFileEncoding(path, "GB2312");
print("coding: " + ec);
// string content = fileReader(path, Encoding.GetEncoding(ec));
// print(content);
//fileWriter(path, "測試內(nèi)容11", Encoding.GetEncoding(ec));
string url = "http://www.XXX.com/20120920172200024.flv";
string path1 = "D:\\aa1.flv";
download(url, path1);
//gapDownload(url, path1);
//t(url);
}
public static void t(string url) {
HttpWebRequest request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
//WebResponse response = httpClient.CreateGetHttpResponse(url, 3000, null, null);
try {
WebResponse response = request.GetResponse();
WebHeaderCollection headers = response.Headers;
print(response.ContentLength);
request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
request.AddRange(11); //設置Range值
WebResponse response1 = request.GetResponse();
print(response1.ContentLength);
foreach (string key in headers)
{
print(key + "----- " + headers.Get(key));
}
string disposition = headers.Get("Content-Disposition");
print(disposition);
}catch(Exception e){
print(e.Message);
}
//string fileName = disposition.Substring(disposition.IndexOf("\""));
//print(fileName);
}
public static void download(string url, string path) {
if (File.Exists(path))
{
print("文件己存在!是否重新下載?");
return;
}
else {
path = path + PERSIST_EXP;
simpleDownload(url,path);//開始下載
}
}
/// <summary>
/// 下載網(wǎng)絡資源(支持斷點續(xù)傳)
/// </summary>
/// <param name="url"></param>
/// <param name="path"></param>
public static void simpleDownload(string url, string path)
{
HttpWebRequest request = httpClient.getWebRequest(url, 0);
WebResponse response = null;
FileStream writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
long lStartPos = writer.Length; ;//當前文件大小
long currentLength = 0;
long totalLength = 0;//總大小
if (File.Exists(path))//斷點續(xù)傳
{
response = request.GetResponse();
long sTotal = response.ContentLength;
if (sTotal == lStartPos) {
close(writer);
File.Move(path, path.Replace(PERSIST_EXP, ""));
print("下載完成!");
return;
}
request = httpClient.getWebRequest(url, (int)lStartPos);
//設置Range值
writer.Seek(lStartPos, SeekOrigin.Begin);//指針跳轉
response = request.GetResponse();
totalLength = response.ContentLength + lStartPos; //總長度
currentLength = lStartPos; //當前長度
}
else
{
response = request.GetResponse();
totalLength = response.ContentLength;
}
Stream reader = response.GetResponseStream();
byte[] buff = new byte[1024];
int c = 0; //實際讀取的字節(jié)數(shù)
while ((c = reader.Read(buff, 0, buff.Length)) > 0)
{
currentLength += c;
writer.Write(buff, 0, c);
progressBar(currentLength, totalLength);//進度條
writer.Flush();
}
close(writer);
if (currentLength == totalLength)
{
File.Move(path, path.Replace(PERSIST_EXP, ""));
print("下載完成!");
}
if (reader != null)
{
reader.Close();
reader.Dispose();
response.Close();
}
}
private static void close(FileStream writer)
{
if (writer != null)
{
writer.Close();
writer.Dispose();
}
}
/// <summary>
/// 進度條
/// </summary>
/// <param name="currentLength">當前長度</param>
/// <param name="totalLength">總長度</param>
public static void progressBar(Object currentLength, Object totalLength)
{
double aaa = System.Convert.ToDouble(currentLength);
double bbb = System.Convert.ToDouble(totalLength);
print(currentLength + "/" + totalLength + "__" + (aaa / bbb).ToString("0.00 %"));
}
/// <summary>
/// 系統(tǒng)輸出
/// </summary>
/// <param name="obj"></param>
public static void print(Object obj){
Console.WriteLine(obj);
}
public static void printStr(string[] str)
{
foreach (string d in str)
{
print(d);
}
}
/// <summary>
/// 文件寫
/// </summary>
/// <param name="path">文件路徑</param>
/// <param name="content">要寫入的內(nèi)容</param>
public static void fileWriter(string path,string content,Encoding encoding)
{
if (File.Exists(path))
{
StreamWriter sw = new StreamWriter(path, true, encoding);
sw.WriteLine(content);
sw.Flush();
sw.Close();
}
}
/// <summary>
/// 讀文件,返回內(nèi)容
/// </summary>
/// <param name="path">文件路徑</param>
/// <param name="enCoding">默認編碼格式</param>
/// <returns></returns>
public static string fileReader(string path,Encoding enCoding) {
StringBuilder sb = new StringBuilder();
if(enCoding == null){
enCoding = Encoding.Default;
}
//讀取文件
StreamReader sr = new StreamReader(path, enCoding);
string s = "";
while ((s = sr.ReadLine()) != null)
{
sb.AppendLine(s);
}
if(sr != null)
sr.Close();
return sb.ToString();
}
/// <summary>
/// 獲取文件編碼格式
/// </summary>
/// <param name="path">文件路徑</param>
/// <param name="defaultEncoding">默認編碼</param>
/// <returns></returns>
public static string getFileEncoding(string path, string defaultEncoding) {
string ed = defaultEncoding;
if (File.Exists(path)) {
FileStream fs = new FileStream(path, FileMode.Open);
ed = GetEncoding(fs, defaultEncoding);
if (fs != null)
fs.Close();
}
return ed;
}
/// <summary>
/// 取得一個文本文件流的編碼方式。
/// </summary>
/// <param name="stream">文本文件流。</param>
/// <param name="defaultEncoding">默認編碼方式。當該方法無法從文件的頭部取得有效的前導符時,將返回該編碼方式。</param>
/// <returns></returns>
public static string GetEncoding(FileStream stream, string defaultEncoding)
{
string targetEncoding = defaultEncoding;
if (stream != null && stream.Length >= 2)
{
//保存文件流的前4個字節(jié)
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
byte byte4 = 0;
//保存當前Seek位置
long origPos = stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);
int nByte = stream.ReadByte();
byte1 = Convert.ToByte(nByte);
byte2 = Convert.ToByte(stream.ReadByte());
if (stream.Length >= 3)
{
byte3 = Convert.ToByte(stream.ReadByte());
}
if (stream.Length >= 4)
{
byte4 = Convert.ToByte(stream.ReadByte());
}
//根據(jù)文件流的前4個字節(jié)判斷Encoding
//Unicode {0xFF, 0xFE};
//BE-Unicode {0xFE, 0xFF};
//UTF8 = {0xEF, 0xBB, 0xBF};
if (byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
{
targetEncoding = Encoding.BigEndianUnicode.BodyName;
}
if (byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
{
targetEncoding = Encoding.Unicode.BodyName;
}
if (byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
{
targetEncoding = Encoding.UTF8.BodyName;
}
//恢復Seek位置
stream.Seek(origPos, SeekOrigin.Begin);
}
return targetEncoding;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.IO;
namespace simpleDemo
{
/// <summary>
/// 公用 Http 請求類
/// </summary>
class httpClient
{
/// <summary>
/// 獲取基礎WebRequest
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="lStartPos">請求的開始位置</param>
/// <returns></returns>
public static HttpWebRequest getWebRequest(string url, int lStartPos)
{
HttpWebRequest request = null;
try
{
request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
request.AddRange(lStartPos); //設置Range值
}
catch (Exception ex)
{
Program.print(ex.Message);
}
return request;
}
}
}
希望本文所述對大家的C#程序設計有所幫助。
相關文章
C#中TreeView實現(xiàn)適合兩級節(jié)點的選中節(jié)點方法
這篇文章主要介紹了C#中TreeView實現(xiàn)適合兩級節(jié)點的選中節(jié)點方法,實例分析了C#中TreeView節(jié)點操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
詳解C# 利用反射根據(jù)類名創(chuàng)建類的實例對象
這篇文章主要介紹了詳解C# 利用反射根據(jù)類名創(chuàng)建類的實例對象,“反射”其實就是利用程序集的元數(shù)據(jù)信息,感興趣的小伙伴們可以參考一下。2017-03-03
C#無法打開計算機“.”上的 IISADMIN 服務的解決方法
在使用c#進行控制IIS服務啟動停止的時候,提示:無法打開計算機“.”上的 IISADMIN 服務2015-01-01
C#實現(xiàn)的微信網(wǎng)頁授權操作邏輯封裝示例
這篇文章主要介紹了C#實現(xiàn)的微信網(wǎng)頁授權操作邏輯封裝,分析了微信網(wǎng)頁授權操作的原理、步驟并給出了C#實現(xiàn)的網(wǎng)頁授權操作邏輯封裝類,需要的朋友可以參考下2016-10-10

