gpt4 book ai didi

golang通过FTP上传并同时获取FTP进度

转载 作者:IT王子 更新时间:2023-10-29 00:47:19 31 4
gpt4 key购买 nike

我用过 http://github.com/dutchcoders/goftp通过 FTP 发送文件。它工作正常,但是当我想上传文件并获取该文件信息时(同时)它不起作用!

fileName := "sth"
var err error
var ftp *goftp.FTP

if ftp, err = goftp.Connect("serverip:port"); err != nil {
fmt.Println(err)
}

defer ftp.Close()

config := tls.Config{
InsecureSkipVerify: true,
ClientAuth: tls.RequestClientCert,
}

if err = ftp.AuthTLS(config); err != nil {
// log.Println("1", err)
}

if err = ftp.Login("userName", "pass"); err != nil {
log.Println("2", err)
}
//
if err = ftp.Cwd("/home/myDir/"); err != nil {
log.Println("3", err)
}

var file *os.File
if file, err = os.Open(fileName); err != nil {
log.Println("6", err)
}
defer file.Close()

fmt.Println("start")

go func() {
fmt.Println("first")
nmp := ftp.Stor(fileName, file)
if nmp != nil {
log.Println("7", err)
} else {
fmt.Println("first is runung")

}
}()

go func() {
fmt.Println("second")
for {
files, nms := ftp.List(fileName)
if nms == nil {
fmt.Println(files)
}
time.Sleep(1 * time.Second)
}
}()

fmt.Println("end")

var mnmn string
fmt.Scan(&mnmn)

ftp.Stor func 不会运行,我的代码返回以下输出:

start
end
first
second
2016/05/31 13:21:38 7 <nil>
[]
[]

最佳答案

目前,两个 goroutine 都有相同的 ftp 实例 (var ftp *goftp.FTP) 因为它们有竞争条件而互相阻塞。而你的结果是不可预测的。有时,它会在第一次正确执行时给出正确的结果。或者当它等待第二个然后完全运行时。或者当 first 不执行时。否则,两个 go 例程都会互相阻塞。解决方案:

  • 你使用两个不同的 ftp 实例来为 goroutine 提供不同的连接

    var ftp,ftp1 *goftp.FTP

点赞Play Golang或者

  • 在 go 主例程中首先有 *goftp stor。然后开始其他go routine。但是会打败second go routine的目的。

关于golang通过FTP上传并同时获取FTP进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541255/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com