1

奇妙な問題に直面しています。FTP からファイルのリストをダウンロードしたいのです。私は Parallel Task を使用することを好みました。以下は私のコードです。問題は、ファイルのすべてのリストがダウンロードされますが、別の名前の重複ファイルが生成されることです。私は並列タスクの概念に非常に慣れていません。問題を見つけるのを手伝ってください。

:sftp接続とダウンロードにSSH.Netを使用しています。

    private void ConcurrentDownload()
    {
        // Declaring Connection Information
        PasswordAuthenticationMethod pm = new PasswordAuthenticationMethod("FTPUserName", "Password");
        ConnectionInfo connectionInfo = new ConnectionInfo("FTPHost", 22, "FTPUserName", ProxyTypes.Socks5, "127.0.0.1", 8080, string.Empty, string.Empty, pm);

        using (SftpClient sfc = new SftpClient(connectionInfo))
        {
        // Establish the remote connection
        sfc.Connect();

        // Getting Remote Directory Contents
        IEnumerable<SftpFile> sFiles = new List<SftpFile>();    
        sFiles = sfc.ListDirectory(".\\");

        // Building the File List                
        List<string> remotefiles = new List<string>();
        foreach (SftpFile sfile in sFiles)
        {
         if (!sfile.IsDirectory)
         {
           string ss = sfile.Name;
           remotefiles.Add(ss);
         }
        }

        // Parallel Download
        Parallel.ForEach(remotefiles.Distinct(), file => DownloadFile(sfc, file)); 
        sfc.Disconnect();
        }
    }

   private void DownloadFile(SftpClient sf, string RemoteFileName)
   {
        using (Stream ms = File.OpenWrite(RemoteFileName))
        {
            sf.DownloadFile(RemoteFileName, ms);
        }
   }
4

1 に答える 1

0

Distinct以下のように使用することをお勧めします

Parallel.ForEach(remotefiles.Distinct(), file => DownloadFile(sfc, file)); 

ファイル名が重複していて、同じファイルで並列処理を開始すると、それらの重複ファイルで例外が発生します。

また、別の場所にダウンロードするのではなく、同じ ftp ソースの場所にダウンロードします。あれは正しいですか?

別のダウンロード ディレクトリを指定し、ソース ファイルからファイル名を取得して、以下のようにその場所にダウンロードします。

    private void DownloadFile(SftpClient sf, string RemoteFileName)
    {
        string downloadTo = Path.Combine(DownloadDirectoryPath, Path.GetFileName(RemoteFileName));
        using (Stream ms = File.OpenWrite(downloadTo))
        {
            sf.DownloadFile(RemoteFileName, ms);
        }
    }

関連資料 :並列での SFTP 非同期アップロード

于 2013-08-08T04:25:20.320 に答える