最简单的文件断点续传程序
通常断点续传指在都是应用在网络文件传输中,由于网络中断或其它原因导致文件需要重新传输,这时候只需要从最后中断前已读取的文件内容开始续传即可。我在这里省去了网络这一环节,全是本地操作。
断点续传原理非常简单:在传输过程中,每次写入内容至目标文件时,都需要记录一下文件流的offset即可。当下次程序重新启动后,读取这个offset值,再从offset的地方继续transfer。
这里我用c#简单写了一个程序来模拟断点续传
1:
2:
3: static int offset = 0; //save the stream position for dest file
4: static void Transfer()
5: {
6: string src = @"f:\test\src.txt";
7: string dest = @"f:\test\dest.txt";
8:
9: try
10: {
11: using (FileStream fout = new FileStream(src, FileMode.Open, FileAccess.Read))
12: {
13: //only read 10 bytes
14: byte[] bout = new byte[10];
15: fout.Read(bout, 0, 10);
16:
17: using (FileStream fin = new FileStream(dest, FileMode.Open, FileAccess.Write))
18: {
19: //write 10 bytes to file
20: fin.Write(bout, 0, bout.Length);
21: offset = bout.Length;
22: //simulate break,in the real environment ,it may be network error,power off etc.
23: throw new ArgumentException("break write");
24:
25: }
26: }
27: }
28: catch (ArgumentException ex)
29: {
30: Console.WriteLine(ex.Message);
31: }
32:
33: //continue write,only for test
34: using (FileStream fout = new FileStream(src, FileMode.Open, FileAccess.Read))
35: {
36: if (offset > 0)
37: {
38: //note: the key point for file continue transfer
39: fout.Seek(offset, SeekOrigin.Begin);
40: }
41: byte[] bout = new byte[1024];
42: fout.Read(bout, 0, bout.Length);
43:
44: using (FileStream fin = new FileStream(dest, FileMode.Append, FileAccess.Write))
45: {
46: fin.Write(bout, 0, bout.Length);
47: }
48: }
49: }
注释都在代码里,不多解释了,这里存在一个问题,我是采用一个varible来save stream position的,现在很多ftp工具或都下载工具都不是这么做的。更好的做法是再读取一次未传输(下载)完成的文件来得到这个position即可,还有稍微复杂的是,不必读取整个文件来计算这个position,可以把这值写到file header中去,再解析一下file header即可,这个有点类似于http协议中的HEAD命令。
Author:repository
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?