Question

J'utilise le code suivant pour télécharger un fichier depuis un serveur FTP distant:

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

Le fichier que je suis le téléchargement est une dll et mon problème est qu'il est modifié par ce processus d'une certaine façon. Je sais cela parce que la taille du fichier augmente. Je soupçonne que cette partie du code est en défaut:

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

Quelqu'un peut-il offrir des idées quant à ce qui peut se tromper?

Était-ce utile?

La solution

StreamReader et StreamWriter travail avec des données de caractère, de sorte que vous décoder le flux d'octets en caractères puis encoder à nouveau revenir à octets. Un fichier dll contient des données binaires, donc cette conversion aller-retour introduira des erreurs. Vous voulez lire des octets directement à partir de l'objet responseStream et écrire à un FileStream qui n'est pas enveloppé dans un StreamWriter.

Si vous utilisez .NET 4.0, vous pouvez utiliser Stream.CopyTo , mais sinon, vous devrez copier manuellement le flux. Cette question StackOverflow a une bonne méthode pour copier des cours d'eau :

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

Alors, votre code ressemblera à ceci:

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream destination = File.Create(destinationFile))
{
    CopyStream(responseStream, destination);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top