c#文件流实现多线程断点续传

  

<强>一、前言

  

,,,,,,网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者写的比较坑长。由于这几个月要负责公司的在线升级项目,所以正好顺便写了一下

  

代码如下:

        使用系统;   使用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#文件流实现多线程断点续传