質問

次のコードを使用して、リモートFTPサーバーからファイルをダウンロードします。

        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

        request.KeepAlive = true;
        request.UsePassive = true;
        request.UseBinary = true;

        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = new NetworkCredential(userName, password);                

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        using (Stream responseStream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(responseStream))
        using (StreamWriter destination = new StreamWriter(destinationFile))
        {
            destination.Write(reader.ReadToEnd());
            destination.Flush();
        }

私がダウンロードしているファイルはDLLであり、私の問題は、何らかの形でこのプロセスによって変更されていることです。ファイルサイズが増加しているため、これを知っています。コードのこのセクションが過失にあるという疑いがあります。

        destination.Write(reader.ReadToEnd());
        destination.Flush();

誰もが何が間違っているのかについてのアイデアを提供できますか?

役に立ちましたか?

解決

StreamReaderStreamWriter 文字データを使用すると、ストリームをバイトから文字にデコードしてから、再びバイトに戻すことができます。 DLLファイルにはバイナリデータが含まれているため、この往復変換によりエラーが導入されます。から直接バイトを読みたい responseStream オブジェクトとに書き込みます FileStream それはに包まれていません StreamWriter.

.NET 4.0を使用している場合は、使用できます Stream.CopyTo, 、それ以外の場合は、ストリームを手動でコピーする必要があります。 このスタックフローの質問 ストリームをコピーするための良い方法があります:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read(buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write(buffer, 0, read);
    }
}

したがって、あなたのコードは次のようになります:

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream destination = File.Create(destinationFile))
{
    CopyStream(responseStream, destination);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top