现在已经有很多断点续传、多线程下载的软件了,比如网际快车等等。下面设计的程序是“断点续传、多线程上载”。
缘起:客户每天都有大量文件上传服务器。这些文件很多,并且体积挺大,FTP有时候会出一些问题,导致传递失败,要重新上传。
基本解决方案:
1:把文件分割成块,每次只是传递一个文件块。
2:一个文件可以起多个发送任务(线程),同时发送。
3:记录文件发送状态,在网络出现问题时(或者客户端意外终止),知道上次发送文件大小和位置指针。再重新链接以后,继续发送。
对象和线程
这里面涉及到一个显示窗体form1,有timer可以随时更新发送状态;一个上传类Uploader(对应于一个文件);Task对象(也就是一个文件);FileThunk对象(每一个任务,对应于一个线程);WebService接受文件类。
发送状态需要记录在数据库。测试状态下,数据记录在xml文件。基本格式如下:
<task name="contact.txt" percentage="" totalSeconds="" localFile="" remoteFile="" fileSize="">
<thread name="thread1" begin="" end="" lastTime=""></thread>
</task>
</tasks>
数据表结构也基本类似这样。
核心代码:
1:form1. 这个主要是显示。主要函数是 添加任务(Task);更新任务状态
2:Uploader的核心代码:主要是启动线程。
3:Task类的主要代码:主要是初始化任务,其他诸如和对数据的保存/提取
4:FileChunk的核心代码:主要是如何上传文件
5:WebService的核心代码
{
_fileName = AppDomain.CurrentDomain.BaseDirectory + """tmp""" + file;
try
{
_fs = File.OpenWrite(_fileName);
_fs.Position = begin;
_fs.Write(data, 0, (int)len);
_fs.Flush();
_fs.Close();
_fs = null;
return "ok";
}
catch (Exception ex)
{
string s = ex.Message;
return "retry";
}
}
小结:
技术难度不大;现实实用;上传速度尚可。
程序运行截图一个