一个程序通过 ftp 下载文件,另外一个程序读取,两个都是定时执行 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zarte
V2EX    Go 编程语言

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

  •  
  •   zarte 2020-01-22 14:14:16 +08:00 4404 次点击
    这是一个创建于 2139 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    感觉你这个需求比较奇怪, 还是从应用场景上优化一下把.
    augustheart
        14
    augustheart &nbp;
       2020-01-22 16:55:16 +08:00   1
    @zarte 没有技术问题,读取不锁文件写入不锁文件就行了。锁文件这个操作是上层的实现做的,并非系统读写文件接口一定会锁住文件。
    实际上你想实现多个写多个读都没问题,操作系统允许你这么干。(当然,多个写你最后写出来的是什么东西就听天由命了)
    给你个实例:百度网盘的视频预览功能,实际上就是边下边读
    zarte
        15
    zarte  
    OP
       2020-01-22 17:09:26 +08:00
    @augustheart 谢谢我试下看看
    loading
        16
    loading  
       2020-01-22 17:11:40 +08:00 via Android
    ftp 是单线程吧,记下读取文件指针就行了,读第二次再从指针处继续
    zarte
        17
    zarte  
    OP
       2020-01-22 17:12:25 +08:00
    @songco 代码实现的。想要的就是这种效果。一个程序复制下载,另外多个程序来读。要解决的是
    1.当在下载时多个程序同时读是否支持。
    2. 支持的情况下。如何实现按行读取,剩下的未满一行的留着下次时间片继续读。
    zarte
        18
    zarte  
    OP
       2020-01-22 17:13:44 +08:00
    @loading ftp 的断点续传这个知道。 之前是一个程序里面先下载然后再读,现在想拆开,一个程序来下载,多个程序来读。
    loading
        19
    loading  
       2020-01-22 17:30:39 +08:00 via Android
    如果下载程序也是你开发,可以参考浏览器下载行为,正在下载就再放一个空的 下载文件名+.lck 的文件。然后读取程序查询这个文件锁。
    linux 的软件源就是这样处理的。
    qiayue
        20
    qiayue  
    PRO
       2020-01-22 18:01:57 +08:00   1
    我们有类似场景,两台服务器,从 A 服务器通过脚本调用,把 AD 目录下的文件通过 SFTP 推送到 B 服务器的 BD 目录,之后 B 服务器的定时程序处理 BD 目录的文件。
    那么在 A 服务期的脚本里写的是, 推送时文件名为 xxxx.tmp ,推送完成后改名为 xxxx.log 。
    在 B 服务器里定时任务,定时扫描 .log 文件,略过 .tmp 文件。
    zarte
        21
    zarte  
    OP
       2020-01-22 18:48:53 +08:00
    @loading 我先试试楼上说的不加锁直接读的。
    msg7086
        22
    msg7086  
       2020-01-23 03:36:43 +08:00
    FTP 本来就没有锁。FTP 软件可以自己实现读写锁,但是并不是必须的。
    我平时自用的一台 FTP 就没有锁读写,一边上传另一边就可以开始下载。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2622 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:48 PVG 19:48 LAX 03:48 JFK 06:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86