一个程序通过 ftp 下载文件,另外一个程序读取,两个都是定时执行

2020-01-22 14:14:16 +08:00
 zarte

如果读取的时候正在下载该文件,如何实现先读取一部分?
有不上锁等待的方式吗?

4000 次点击
所在节点    Go 编程语言
22 条回复
BingoXuan
2020-01-22 15:29:55 +08:00
下载文件名和读取文件名不一样,下载程序下载完就重命名,读取程序每秒判断有没有对应名称的文件
superrichman
2020-01-22 15:35:47 +08:00
改成分片下载,另外一个程序读取分片数据
mrjnamei
2020-01-22 15:45:52 +08:00
读一部分的目的是干嘛呢?既然要文件的内容读到的那一部分有啥用呢
cmdOptionKana
2020-01-22 15:50:13 +08:00
既然是定时,可以放在不同的文件夹里。

比如第一次下载的文件全部在文件夹 1 里,第二次在文件夹 2 里。
hiouyuu
2020-01-22 15:54:15 +08:00
读取的时候,查询两次文件尺寸,不变则认为文件已经上传完成。
不太严谨
augustheart
2020-01-22 16:00:19 +08:00
只是要实现写的时候读取的话很容易啊。实际上所不锁完全看 ftp 的实现。比如 windows 的 createfile 完全可以让你做到这些,linux 我不熟,但是从 fd 下手应该也是没问题的。
这个需求的问题在于为啥要这么干,比如一个压缩包,你不作特殊处理从头到尾边下边读是毫无意义的( zip 的文件表在包结尾)。实现起来都是没有任何难度的。
zarte
2020-01-22 16:26:32 +08:00
@mrjnamei 因为文件是定时获取追加的。下载使用一个程序,读取会有多个程序。
zarte
2020-01-22 16:27:29 +08:00
@cmdOptionKana 并不是一次性下载完的,需要定时获取新数据。
zarte
2020-01-22 16:28:15 +08:00
@augustheart 是文档,想实现的是一个下载多个读取。
fengtons
2020-01-22 16:37:17 +08:00
另外增加个文件记录下载状态,读之前先判断是否已经下载完成。
zarte
2020-01-22 16:42:21 +08:00
@fengtons 那跟上锁没区别了呀!不用等下载完成的。先获取目前下载好的就行。剩下的下次再读。
cmdOptionKana
2020-01-22 16:44:28 +08:00
@zarte 一样的思路,定时或者定量分片,直接 文件名+“01” 作为一个分片的文件名,接着生产下一个分片继续下载(隐约记得以前有些下载工具就是这么干的)
songco
2020-01-22 16:50:59 +08:00
ftp 是代码实现的?

如果是代码实现的, ftp 顺序下载不分块, 读取应用先判断一下文件大小, 读到一部分, 然后再判断文件大小不就行了

如果分块下载那确实不好做, 估计要个第三方服务记录分段完成信息, 比如另外搞一个文件, 记录分块和每块完成的情况, 读取的应用可以根据这个读.

感觉你这个需求比较奇怪, 还是从应用场景上优化一下把.
augustheart
2020-01-22 16:55:16 +08:00
@zarte 没有技术问题,读取不锁文件写入不锁文件就行了。锁文件这个操作是上层的实现做的,并非系统读写文件接口一定会锁住文件。
实际上你想实现多个写多个读都没问题,操作系统允许你这么干。(当然,多个写你最后写出来的是什么东西就听天由命了)
给你个实例:百度网盘的视频预览功能,实际上就是边下边读
zarte
2020-01-22 17:09:26 +08:00
@augustheart 谢谢我试下看看
loading
2020-01-22 17:11:40 +08:00
ftp 是单线程吧,记下读取文件指针就行了,读第二次再从指针处继续
zarte
2020-01-22 17:12:25 +08:00
@songco 代码实现的。想要的就是这种效果。一个程序复制下载,另外多个程序来读。要解决的是
1.当在下载时多个程序同时读是否支持。
2. 支持的情况下。如何实现按行读取,剩下的未满一行的留着下次时间片继续读。
zarte
2020-01-22 17:13:44 +08:00
@loading ftp 的断点续传这个知道。 之前是一个程序里面先下载然后再读,现在想拆开,一个程序来下载,多个程序来读。
loading
2020-01-22 17:30:39 +08:00
如果下载程序也是你开发,可以参考浏览器下载行为,正在下载就再放一个空的 下载文件名+.lck 的文件。然后读取程序查询这个文件锁。
linux 的软件源就是这样处理的。
qiayue
2020-01-22 18:01:57 +08:00
我们有类似场景,两台服务器,从 A 服务器通过脚本调用,把 AD 目录下的文件通过 SFTP 推送到 B 服务器的 BD 目录,之后 B 服务器的定时程序处理 BD 目录的文件。
那么在 A 服务期的脚本里写的是, 推送时文件名为 xxxx.tmp ,推送完成后改名为 xxxx.log 。
在 B 服务器里定时任务,定时扫描 .log 文件,略过 .tmp 文件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639850

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX