سؤال

أنا أقوم ببناء فئة فائدة FTP في C #. في حالة ذلك WebException ألقيت على مكالمة FtpWebRequest.GetResponse(), في حالتي يتم طرح الاستثناء للملف المطلوب غير موجود على الخادم البعيد FtpWebResponse المتغير هو خارج نطاق.

ولكن حتى لو أعلن المتغير خارج try..catch كتلة أحصل على خطأ في ترجمة تقول "استخدام الاستجابة المتغيرة المحلية غير المعينة" "، ولكن بقدر ما أستطيع أن أخبر أنه لا توجد وسيلة لتعيينه حتى تقوم بتعيين الاستجابة عبر 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
            }
        }
هل كانت مفيدة؟

المحلول

كما طريقة عامة لحل هذا، فقط تعيين null إلى الاستجابة أولا ثم تحقق في كتلة الصيد إذا كان كذلك null.

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

ومع ذلك، في هذه الحالة المحددة، لديك كل الخصائص التي تحتاجها على WebException مثيل (بما في ذلك استجابة الخادم)!

نصائح أخرى

يمكن العثور على الحل الصحيح للمشكلة في هذا السؤال هنا:
كيفية التحقق مما إذا كان الملف موجود على FTP قبل FTPWebRequest

بالمختصر:
سيكون متغير "الاستجاب" دائما باغلا عن الخطأ. تحتاج إلى اختبار FTPWebresponse من "WebEx.Response" (يلقي بها) للحصول على الحالة.

حسنا، يمكنك دائما تعيين متغير:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top