4

C# で FTP ユーティリティ クラスを作成しています。WebExceptionへの呼び出しでaがスローされるFtpWebRequest.GetResponse()場合、私の場合、要求されたファイルがリモートサーバーに存在しないために例外がスローされ、FtpWebResponse変数はスコープ外です。

しかし、変数をブロックの外で宣言しても、try..catch「割り当てられていないローカル変数 'response' の使用」というコンパイル エラーが発生しますが、私が知る限り、FtpWebRequest.GetResponse()メソッドを介して応答を割り当てるまで、それを割り当てる方法はありません。

誰かがアドバイスしてもらえますか、それとも明らかな何かが欠けていますか?

ありがとう!

これが私の現在の方法です:

private void Download(string ftpServer, string ftpPath, string ftpFileName, string localPath, 
                           string localFileName, string ftpUserID, string ftpPassword)
    {
        FtpWebRequest reqFTP;
        FtpWebResponse response;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"
               + ftpServer + "/" + ftpPath + "/" + ftpFileName));
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserID,
                                                       ftpPassword);

            /* HERE IS WHERE THE EXCEPTION IS THROWN FOR FILE NOT AVAILABLE*/
            response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();


            FileStream outputStream = new FileStream(localPath + "\\" +
               localFileName, FileMode.Create);

            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];

            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }
        catch (WebException webex)
        {
            /*HERE THE response VARIABLE IS UNASSIGNED*/
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { 
                //do something
            }
        }
4

3 に答える 3

6

これを解決する一般的な方法として、null最初に応答に割り当ててから、catch ブロックでチェックインするかどうかを確認しnullます。

    FtpWebResponse response = null;
    try
    {
...
    }
    catch (WebException webex)
    {
        if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) { 
            //do something
        }
    }

WebExceptionただし、この特定のケースでは、インスタンスに必要なすべてのプロパティがあります (サーバーの応答を含む)!

于 2010-03-11T10:29:33.883 に答える
2

この問題の正しい解決策は、この質問で見つけることができます:
How to check if file exists on FTP before FtpWebRequest

つまり
、エラーのため、「応答」変数は常に null になります。StatusCode を取得するには、「webex.Response」から FtpWebResponse をテスト (キャスト) する必要があります。

于 2010-04-21T06:11:57.060 に答える
1

いつでも変数を割り当てることができます:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
于 2010-03-11T10:29:37.560 に答える