如果读取的时候正在下载该文件,如何实现先读取一部分?
有不上锁等待的方式吗?
1
BingoXuan 2020-01-22 15:29:55 +08:00 via Android 1
下载文件名和读取文件名不一样,下载程序下载完就重命名,读取程序每秒判断有没有对应名称的文件
|
2
superrichman 2020-01-22 15:35:47 +08:00 via iPhone
改成分片下载,另外一个程序读取分片数据
|
3
mrjnamei 2020-01-22 15:45:52 +08:00
读一部分的目的是干嘛呢?既然要文件的内容读到的那一部分有啥用呢
|
4
cmdOptionKana 2020-01-22 15:50:13 +08:00
既然是定时,可以放在不同的文件夹里。
比如第一次下载的文件全部在文件夹 1 里,第二次在文件夹 2 里。 |
5
hiouyuu 2020-01-22 15:54:15 +08:00
读取的时候,查询两次文件尺寸,不变则认为文件已经上传完成。
不太严谨 |
6
augustheart 2020-01-22 16:00:19 +08:00
只是要实现写的时候读取的话很容易啊。实际上所不锁完全看 ftp 的实现。比如 windows 的 createfile 完全可以让你做到这些,linux 我不熟,但是从 fd 下手应该也是没问题的。
这个需求的问题在于为啥要这么干,比如一个压缩包,你不作特殊处理从头到尾边下边读是毫无意义的( zip 的文件表在包结尾)。实现起来都是没有任何难度的。 |
8
zarte OP @cmdOptionKana 并不是一次性下载完的,需要定时获取新数据。
|
9
zarte OP @augustheart 是文档,想实现的是一个下载多个读取。
|
10
fengtons 2020-01-22 16:37:17 +08:00 via Android 1
另外增加个文件记录下载状态,读之前先判断是否已经下载完成。
|
12
cmdOptionKana 2020-01-22 16:44:28 +08:00
@zarte 一样的思路,定时或者定量分片,直接 文件名+“01” 作为一个分片的文件名,接着生产下一个分片继续下载(隐约记得以前有些下载工具就是这么干的)
|
13
songco 2020-01-22 16:50:59 +08:00
ftp 是代码实现的?
如果是代码实现的, ftp 顺序下载不分块, 读取应用先判断一下文件大小, 读到一部分, 然后再判断文件大小不就行了 如果分块下载那确实不好做, 估计要个第三方服务记录分段完成信息, 比如另外搞一个文件, 记录分块和每块完成的情况, 读取的应用可以根据这个读. 感觉你这个需求比较奇怪, 还是从应用场景上优化一下把. |
14
augustheart 2020-01-22 16:55:16 +08:00 1
@zarte 没有技术问题,读取不锁文件写入不锁文件就行了。锁文件这个操作是上层的实现做的,并非系统读写文件接口一定会锁住文件。
实际上你想实现多个写多个读都没问题,操作系统允许你这么干。(当然,多个写你最后写出来的是什么东西就听天由命了) 给你个实例:百度网盘的视频预览功能,实际上就是边下边读 |
15
zarte OP @augustheart 谢谢我试下看看
|
16
loading 2020-01-22 17:11:40 +08:00 via Android
ftp 是单线程吧,记下读取文件指针就行了,读第二次再从指针处继续
|
17
zarte OP @songco 代码实现的。想要的就是这种效果。一个程序复制下载,另外多个程序来读。要解决的是
1.当在下载时多个程序同时读是否支持。 2. 支持的情况下。如何实现按行读取,剩下的未满一行的留着下次时间片继续读。 |
18
zarte OP @loading ftp 的断点续传这个知道。 之前是一个程序里面先下载然后再读,现在想拆开,一个程序来下载,多个程序来读。
|
19
loading 2020-01-22 17:30:39 +08:00 via Android
如果下载程序也是你开发,可以参考浏览器下载行为,正在下载就再放一个空的 下载文件名+.lck 的文件。然后读取程序查询这个文件锁。
linux 的软件源就是这样处理的。 |
20
qiayue 2020-01-22 18:01:57 +08:00 1
我们有类似场景,两台服务器,从 A 服务器通过脚本调用,把 AD 目录下的文件通过 SFTP 推送到 B 服务器的 BD 目录,之后 B 服务器的定时程序处理 BD 目录的文件。
那么在 A 服务期的脚本里写的是, 推送时文件名为 xxxx.tmp ,推送完成后改名为 xxxx.log 。 在 B 服务器里定时任务,定时扫描 .log 文件,略过 .tmp 文件。 |
22
msg7086 2020-01-23 03:36:43 +08:00
FTP 本来就没有锁。FTP 软件可以自己实现读写锁,但是并不是必须的。
我平时自用的一台 FTP 就没有锁读写,一边上传另一边就可以开始下载。 |