Domanda

Sto utilizzando il seguente codice per scaricare un file da un server FTP remoto:

        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();
        }

Il file che si sta scaricando è una DLL e il mio problema è che esso viene alterato da questo processo, in qualche modo. Lo so perché la dimensione del file è in aumento. Ho il sospetto che questa sezione di codice è la colpa:

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

Qualcuno può offrire tutte le idee su ciò che può essere sbagliato?

È stato utile?

Soluzione

StreamReader e lavorare StreamWriter con dati di caratteri, in modo che si sta decodificando il flusso da byte a caratteri e quindi la codifica di nuovo a byte di nuovo. Un file dll contiene dati binari, in modo da questa conversione di andata e ritorno introdurrà errori. Si desidera leggere i byte direttamente dall'oggetto responseStream e scrittura a un FileStream che non è avvolto in un StreamWriter.

Se si utilizza .NET 4.0 è possibile utilizzare Stream.CopyTo , ma per il resto si dovrà copiare il flusso manualmente. Questa domanda StackOverflow ha un buon metodo per la copia di flussi :

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);
    }
}

Quindi, il codice sarà simile a questa:

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream destination = File.Create(destinationFile))
{
    CopyStream(responseStream, destination);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top