سؤال

أنا أستخدم الكود التالي لتنزيل ملف من خادم 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();

هل يمكن لأي شخص تقديم أي أفكار حول ما قد يكون خطأ؟

هل كانت مفيدة؟

المحلول

StreamReader و StreamWriter اعمل مع بيانات الأحرف ، لذلك تقوم بفك تشفير الدفق من البايت إلى الأحرف ثم ترميزه مرة أخرى إلى البايتات مرة أخرى. يحتوي ملف DLL على بيانات ثنائية ، لذلك سيؤدي تحويل الرحلة المستدير إلى تقديم أخطاء. تريد قراءة البايتات مباشرة من responseStream كائن واكتب إلى FileStream هذا غير ملفوف في StreamWriter.

إذا كنت تستخدم .NET 4.0 يمكنك استخدامها Stream.CopyTo, ، ولكن على خلاف ذلك ، سيتعين عليك نسخ الدفق يدويًا. هذا السؤال stackoverflow لديه طريقة جيدة لنسخ التدفقات:

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