<强>一、前言强>
,,,,,,网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者写的比较坑长。由于这几个月要负责公司的在线升级项目,所以正好顺便写了一下
代码如下:
使用系统; 使用System.Collections.Generic; 使用先; 使用System.Threading.Tasks; 名称空间TestCenter { 类项目 { 静态void Main (string [] args) { 字符串LocalSavePath=@ " E: \ \本地测试文件\ \测试1. msi”;//本地目标文件路径 FileInfo SeverFilePath=new FileInfo (@“E: \ \测试文件\ Server \测试1. msi”);//服务器待文件路径 长FileLength=SeverFilePath.Length;//待下载文件大小 控制台。WriteLine(“启动配置”); int PackCount=0;//初始化数据包个数 长PackSize=1024000;//数据包大小 如果(FileLength % PackSize比;0) { PackCount=(int) (FileLength/PackSize) + 1; } 其他的 { PackCount=(int) (FileLength/PackSize); } 控制台。WriteLine(“开始接待”); var任务=新任务(PackCount);//多线程任务 for (int指数=0;指数& lt;PackCount;指数+ +) { int Threadindex=指数;//这步很关键,在任务()里的绝对不能直接使用指数 var=新任务(任务()=比; { 字符串tempfilepath=@ " E: \测试\测试文件\ Temp \”+“QS_”+ Threadindex +“_”+ PackCount;//临时文件路径 使用(tempstream=new FileStream文件流(tempfilepath FileMode。创建、FileAccess。写,FileShare.Write)) { int长度=(int)数学。Min (PackSize FileLength——Threadindex * PackSize); var字节=GetFile (Threadindex * PackCount,长度); tempstream。写(字节0长度); tempstream.Flush (); tempstream.Close (); tempstream.Dispose (); } }); 任务[Threadindex]=任务; task.Start (); } Task.WaitAll(任务);//等待所有线程完成 控制台。WriteLine(接收端);//检测有哪些数据包未下载 控制台。WriteLine(“开始比较”); DirectoryInfo TempDir=new DirectoryInfo (@“E: \ \测试文件测试\ temp”);//临时文件夹路径 ListComparefiles=new List (); for (int i=0;我& lt;PackCount;我+ +) { bool hasfile=false; 在foreach (FileInfo Tempfile TempDir.GetFiles ()) { 如果(Tempfile.Name.Split (“_”) [1]==i.ToString ()) { hasfile=true; 打破; } } 如果(hasfile==false) { Comparefiles.Add (i.ToString ()); } }//最后补上这些缺失的文件 如果(Comparefiles。数比;0) { foreach (string com_index Comparefiles) { 字符串tempfilepath=@ " E: \测试\测试文件\ Temp \”+“QS_”+ com_index +“_”+ PackCount; 使用(Compstream=new FileStream文件流(tempfilepath FileMode。创建、FileAccess。写,FileShare.Write)) { int长度=(int)数学。分钟(PackSize FileLength Convert.ToInt32 (com_index) * PackSize); var字节=GetFile (Convert.ToInt32 (com_index) * PackCount长度); Compstream。写(字节0长度); Compstream.Flush (); Compstream.Close (); Compstream.Dispose (); } } } 控制台。WriteLine(“比较端”);//准备将临时文件融合并写到1. msi中 控制台。WriteLine(“开始写”); 使用(writestream=new FileStream文件流(LocalSavePath FileMode。创建、FileAccess。写,FileShare.Write)) { 在foreach (FileInfo Tempfile TempDir.GetFiles ()) { 使用(readTempStream=new FileStream文件流(Tempfile。FullName, FileMode。开放,FileAccess。阅读,FileShare.ReadWrite)) { 长onefileLength=Tempfile.Length; byte[]缓冲=new byte [Convert.ToInt32 (onefileLength)]; readTempStream。读(缓冲区,0,Convert.ToInt32 (onefileLength)); writestream。写(缓冲区,0,Convert.ToInt32 (onefileLength)); } } writestream.Flush (); writestream.Close (); writestream.Dispose (); } 控制台。WriteLine(“写结束”);//删除临时文件 控制台。WriteLine(“开始删除临时文件”); 在foreach (FileInfo Tempfile TempDir.GetFiles ()) { Tempfile.Delete (); } 控制台。WriteLine(“删除成功”); Console.ReadKey (); }//这个方法可以放到远程或者WCF服务中去,然后本地调用该方法即可实现多线程断点续传 公共静态byte [] GetFile (int, int长度) { 字符串SeverFilePath=@ " E: \ \测试文件\ Server \测试1. msi”; 使用(ServerStream=new FileStream文件流(SeverFilePath FileMode。开放,FileAccess。读,文件共享。读写,1024 * 80,真的) { 缓冲区byte[]=新的字节(长度); ServerStream。位置=开始;//ServerStream。寻求(开始,SeekOrigin.Begin); ServerStream。阅读(缓冲区,0,长度); 返回缓冲区; } } } } c#文件流实现多线程断点续传