1

しばらく前に、ある場所から別の場所にファイルをチャンクでコピーする方法について質問しました。CopyFileEx「パラメータが無効です」エラー

私は非常に役立つ次のコードを受け取りました。

    static void chunkCopyFile(string source, string destination, int bytesPerChunk)
    {
        uint bytesRead = 0;

        using (FileStream fs = new FileStream(source, FileMode.Open, FileAccess.Read)) {
            using (BinaryReader br = new BinaryReader(fs)) {
                using (FileStream fsDest = new FileStream(destination, FileMode.Create)) {
                    BinaryWriter bw = new BinaryWriter(fsDest);
                    byte[] buffer;

                    for (int i = 0; i < fs.Length; i += bytesPerChunk) {
                        buffer = br.ReadBytes(bytesPerChunk);
                        bw.Write(buffer);
                        bytesRead += Convert.ToUInt32(bytesPerChunk);
                        updateProgress(bytesRead);
                    }
                }
            }
        }
    }

ただし、代わりにFTPを使用するようにこのコードを変換する必要があります。FTPパスをファイルストリームに渡すだけのことは明らかですが、「サポートされていません」というエラーが表示されました。

私はすでにファイルの長さを取得することができましたが、ダウンロードをチャンクに分割する方法がわかりません。いつものようにどんな助けも大歓迎です!

これまでのコード(あまりありません)

static void chunkCopyFTPFile(string destination, int bytesPerChunk)
    {
        uint bytesRead = 0;

        fWR = (FtpWebRequest)WebRequest.Create("ftp://" + FTP_SERVER_NAME + "/test.txt");
        fWR.Method = WebRequestMethods.Ftp.DownloadFile;
        fWR.UseBinary = true;

        fWR.Credentials = new NetworkCredential(FTP_SERVER_USERNAME, FTP_SERVER_PASSWORD);

        FtpWebResponse response = (FtpWebResponse)fWR.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader sR = new StreamReader(responseStream);

        sR.ReadToEnd();

        sR.Close();
        response.Close();
    }

最終コード(動作中):

using (Stream responseStream = response.GetResponseStream()) {
            using (BinaryReader bR = new BinaryReader(responseStream)) {
                using (FileStream fsDest = new FileStream(destination, FileMode.Create)) {
                    BinaryWriter bw = new BinaryWriter(fsDest);
                    int readCount;
                    byte[] buffer = new byte[bytesPerChunk];

                    readCount = responseStream.Read(buffer, 0, bytesPerChunk);
                    bytesRead += Convert.ToUInt32(readCount);
                    updateProgress(bytesRead);

                    while (readCount > 0) {
                        bw.Write(buffer, 0, readCount);
                        readCount = responseStream.Read(buffer, 0, bytesPerChunk);
                        bytesRead += Convert.ToUInt32(readCount);
                        updateProgress(bytesRead);
                    }
                }
            }
        }
4

1 に答える 1

2

さて、ここであなたが試すことができるものです。このコードはテストされていません。したがって、エラーが含まれていて機能する場合は、回答を編集するか、間違いを指摘してください。

static void chunkCopyFile(string source, string destination, int bytesPerChunk)
{
    uint bytesRead = 0;
    //Instead of this:
    //using (FileStream fs = new FileStream(source, FileMode.Open, FileAccess.Read)) {

    //...some necessary stuff...
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm");
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();

    //Use this:
    using(Stream fs = response.GetResponseStream()){

        using (BinaryReader br = new BinaryReader(fs)) {
            using (FileStream fsDest = new FileStream(destination, FileMode.Create)) {
                BinaryWriter bw = new BinaryWriter(fsDest);
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];

                readCount = fs.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                   bw.Write(buffer, 0, readCount);
                   readCount = fs.Read(buffer, 0, bufferSize);
                   updateProgress(readCount);
                }
            }
        }
    }
}

参照:

http://msdn.microsoft.com/en-us/library/ms229711

http://www.codeproject.com/Articles/17202/Simple-FTP-demo-application-using-C-Net-2-0(メソッドコードのダウンロード)

于 2012-08-20T14:04:52.727 に答える