2

サーバーからファイルをダウンロードするために使用される次のコードがあります。これはテキストファイルで機能します。コードはMSDNサンプルから取得されます。

public void DownloadFile(string serverPath, string localPath)
        {

            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + serverPath);

                request.Method = WebRequestMethods.Ftp.DownloadFile;
                request.Credentials = new NetworkCredential(_domain + "\\" + _username, _password);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                string contents = reader.ReadToEnd();
                File.WriteAllText(localPath, contents);

                reader.Close();
                response.Close();

            }
            catch (WebException ex)
            {                
                string exMsg = string.Empty;


                //add more error codes               
                FtpWebResponse response = (FtpWebResponse)ex.Response;
                MessageBox.Show(response.StatusCode.ToString());

                switch(response.StatusCode) {
                    case  FtpStatusCode.NotLoggedIn:
                        exMsg = "wrong password";
                        break;

                    case FtpStatusCode.ActionNotTakenFileUnavailable:
                        exMsg = "file you are trying to load is not found";
                        break;

                    default:
                        exMsg = "The server is inaccessible or taking too long to respond.";
                        break;
                }   

                throw new Exception(exMsg);
            }

            return;
        }

ただし、dllとexeが破損します。ここでの犯人は何ですか?

4

2 に答える 2

3

それを試してください:

request.UseBinary = true;
于 2012-09-26T16:40:56.913 に答える
2

StreamReaderはテキストデータ(これはTextReader)を読み取ることを目的としているため、これを使用するとバイナリファイルが破損します。

ストリームから直接読み取る必要があります。

次のことができるはずです。

Stream responseStream = response.GetResponseStream();

// Don't read/write as text!
// StreamReader reader = new StreamReader(responseStream);
// string contents = reader.ReadToEnd();
//  File.WriteAllText(localPath, contents);

using (var output = File.OpenWrite(localPath))
{
    responseStream.CopyTo(output);
}

編集:

.NET 3.5を使用しているため、ストリームを手動でコピーできます。

Stream responseStream = response.GetResponseStream();
using (var output = File.OpenWrite(localPath))
{
    byte[] buffer = new byte[32768];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write (buffer, 0, read);
    }
}
于 2012-09-26T16:38:30.900 に答える