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 · 3999 次点击
    这是一个创建于 1773 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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  
       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  
       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   ·   实用小工具   ·   2553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:50 · PVG 23:50 · LAX 07:50 · JFK 10:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.