2

私のアプリケーションでは、FTP サーバーからいくつかのファイルをダウンロードする必要があります。for ループを介して 1 つずつダウンロードするようにコーディングしましたが、問題なく動作します。FTPサーバーでこれらのファイルを圧縮できれば、すぐにダウンロードできます..方法があれば、plsが私を案内してくれます..ここに私のコード:

引用符

    private void button1_Click(object sender, EventArgs e)
    {
        string[] list = GetFileList();
        DownloadFile(list, "e:\\sample\\");
    }

    private String[] GetFileList()
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(_remoteHost));
        request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
        request.Method = WebRequestMethods.Ftp.ListDirectory;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        string FileNames = reader.ReadToEnd();
        string[] Files = Regex.Split(FileNames, "\r\n");
        return Files;
    }


    private void DownloadFile(string[] fileList, string destination)
    {
        for (int i = 2; i <= fileList.Length - 1; i++)
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);

            StreamWriter writer = new StreamWriter(destination + fileList[i]);
            writer.Write(reader.ReadToEnd());

            writer.Close();
            reader.Close();
            response.Close();
    }
}

引用符

4

3 に答える 3

1

.NET 3.0以降を使用している場合は、System.IO.Packaging名前空間に存在するZipPackageクラスを利用できます。私はまだリモートマシンに存在するファイルを圧縮しようとはしていませんが、試してみることができます。そうでない場合は、ファイルを圧縮してリモート(ftp)サーバーに展開するための小さなジョブを作成する必要があります。

于 2012-09-17T11:57:42.530 に答える
1

ユーザー名とパスワードを使用して FtpWebRequest を 1 回開始し、ラウンドごとに新しいファイルを作成する代わりに、すべてのファイルに対して foreach ループでそれを使用しないのはなぜですか?

別の方法は、サードパーティのツール ( http://www.rebex.net/ftp-ssl.net/など) を使用することです。これはより高速である可能性がありますが、テストする必要があるものです。これを見てください: https://stackoverflow.com/a/2343689/395659

3番目の方法は、サーバー上でジョブを実行して、期間に1回ZIPファイルを作成し、質問に記載されているようにZipファイルとしてダウンロードすることです。

于 2012-09-17T11:35:28.550 に答える
1

資格情報を再利用できるため、速度が向上する可能性があります...

private void DownloadFile(string[] fileList, string destination)
{

    var myCred = new NetworkCredential(_remoteUser, _remotePass);

    for (int i = 2; i <= fileList.Length - 1; i++)
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = myCred;
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        StreamWriter writer = new StreamWriter(destination + fileList[i]);
        writer.Write(reader.ReadToEnd());

        writer.Close();
        reader.Close();
        response.Close();
}

}

于 2012-09-17T11:39:55.490 に答える