Golang Go语言中两个程序分别定时通过FTP下载文件和读取文件

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中两个程序分别定时通过FTP下载文件和读取文件

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

23 回复

下载文件名和读取文件名不一样,下载程序下载完就重命名,读取程序每秒判断有没有对应名称的文件

更多关于Golang Go语言中两个程序分别定时通过FTP下载文件和读取文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


改成分片下载,另外一个程序读取分片数据

读一部分的目的是干嘛呢?既然要文件的内容读到的那一部分有啥用呢

既然是定时,可以放在不同的文件夹里。

比如第一次下载的文件全部在文件夹 1 里,第二次在文件夹 2 里。

读取的时候,查询两次文件尺寸,不变则认为文件已经上传完成。
不太严谨

只是要实现写的时候读取的话很容易啊。实际上所不锁完全看 ftp 的实现。比如 windows 的 createfile 完全可以让你做到这些,linux 我不熟,但是从 fd 下手应该也是没问题的。
这个需求的问题在于为啥要这么干,比如一个压缩包,你不作特殊处理从头到尾边下边读是毫无意义的( zip 的文件表在包结尾)。实现起来都是没有任何难度的。

因为文件是定时获取追加的。下载使用一个程序,读取会有多个程序。

并不是一次性下载完的,需要定时获取新数据。

是文档,想实现的是一个下载多个读取。

另外增加个文件记录下载状态,读之前先判断是否已经下载完成。

那跟上锁没区别了呀!不用等下载完成的。先获取目前下载好的就行。剩下的下次再读。

一样的思路,定时或者定量分片,直接 文件名+“01” 作为一个分片的文件名,接着生产下一个分片继续下载(隐约记得以前有些下载工具就是这么干的)

ftp 是代码实现的?

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

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

感觉你这个需求比较奇怪, 还是从应用场景上优化一下把.

没有技术问题,读取不锁文件写入不锁文件就行了。锁文件这个操作是上层的实现做的,并非系统读写文件接口一定会锁住文件。
实际上你想实现多个写多个读都没问题,操作系统允许你这么干。(当然,多个写你最后写出来的是什么东西就听天由命了)
给你个实例:百度网盘的视频预览功能,实际上就是边下边读

谢谢我试下看看

ftp 是单线程吧,记下读取文件指针就行了,读第二次再从指针处继续

代码实现的。想要的就是这种效果。一个程序复制下载,另外多个程序来读。要解决的是
1.当在下载时多个程序同时读是否支持。
2. 支持的情况下。如何实现按行读取,剩下的未满一行的留着下次时间片继续读。

ftp 的断点续传这个知道。 之前是一个程序里面先下载然后再读,现在想拆开,一个程序来下载,多个程序来读。

如果下载程序也是你开发,可以参考浏览器下载行为,正在下载就再放一个空的 下载文件名+.lck 的文件。然后读取程序查询这个文件锁。
linux 的软件源就是这样处理的。

我们有类似场景,两台服务器,从 A 服务器通过脚本调用,把 AD 目录下的文件通过 SFTP 推送到 B 服务器的 BD 目录,之后 B 服务器的定时程序处理 BD 目录的文件。
那么在 A 服务期的脚本里写的是, 推送时文件名为 xxxx.tmp ,推送完成后改名为 xxxx.log 。
在 B 服务器里定时任务,定时扫描 .log 文件,略过 .tmp 文件。

我先试试楼上说的不加锁直接读的。

FTP 本来就没有锁。FTP 软件可以自己实现读写锁,但是并不是必须的。
我平时自用的一台 FTP 就没有锁读写,一边上传另一边就可以开始下载。

在Golang中,通过FTP下载文件和读取文件是两个常见的任务,通常可以使用标准库或第三方库来实现。

对于FTP下载文件,你可以使用github.com/jlaffaye/ftp这个第三方库,它提供了方便的FTP客户端功能。首先,你需要安装这个库:

go get github.com/jlaffaye/ftp

然后,你可以使用以下代码片段来连接FTP服务器并下载文件:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/jlaffaye/ftp"
)

func main() {
    c, err := ftp.Dial("ftp.example.com:21", ftp.DialWithTimeout(5*time.Second))
    if err != nil {
        log.Fatal(err)
    }
    defer c.Quit()

    err = c.Login("user", "password")
    if err != nil {
        log.Fatal(err)
    }

    file, err := os.Create("downloaded_file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    err = c.Retr("remote_file.txt", file)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("File downloaded successfully")
}

对于读取文件,你可以使用标准库中的osio/ioutil包。如果你需要定时执行这些任务,可以使用time包中的TickerTimer

以上是一个基本的示例,实际应用中你可能需要处理更多的错误和边界情况。希望这能帮助你开始使用Golang进行FTP下载和文件读取。

回到顶部