2016-05-31 39 views
4

私はhttp://github.com/dutchcoders/goftpを使ってFTP経由でファイルを送信しました。それは正常に動作しますが、ファイルをアップロードしてそのファイル情報を取得したいとき(同時に)、うまくいきません!golang FTPでアップロードして同時に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> 
[] 
[] 
+0

あなたは完全なメインを共有できますか?メインをブロックしていますか?それ以外の場合は、ルーチンを待つことはありません。 – khrm

+0

@khrm私は自分の質問を編集しました! –

+0

あなたはftpの2つの異なるインスタンスをとっておくことができます。その後、正常に動作します。 – khrm

答えて

1
現在

、両方のゴルーチンが同じftpのインスタンスを持っている(VARのFTP * goftp.FTP 彼らは競争状態を持っているのでお互いをブロックしている。あなたの結果は予測不可能です。ときどき、最初に正しく実行すると正しい結果が得られます。または、2秒待ってから完全に実行されます。または、最初に実行されないとき。それ以外の場合は、両方のgoルーチンが互いにブロックしています。 Solutons:

  • あなたはPlay Golang それとも

    • している* goftpのSTOR最初にここに同様

      var ftp,ftp1 *goftp.FTP 
      

    をゴルー​​チンする異なる接続を与えるために、FTPの2つの異なるインスタンスを取ります主なルーチン。その後、他のルーチンを開始します。しかし、それは第二のルーチンの目的を破るだろう。

+0

ええ、それはFTP技術のために起こったのですか?もしそうなら、ここでファイル情報にアクセスする最善の方法は何ですか(アップロード時間)SSH? –

+0

@MasoodAfrashteh私は自分自身をより明確にしました。これはftp技術ではなく* goftp.FTPによるものです。両方のルーチンで同じ接続を使用しています。 – khrm

+1

@MasoodAfrashteh私はそれを説明するコードを追加しました。私はローカルマシン上でftpサーバを稼働させているので、適切な変更を加えました。 – khrm

関連する問題