Question

Le code suivant est destiné à récupérer un fichier via FTP. Cependant, je reçois une erreur avec.

serverPath = "ftp://x.x.x.x/tmp/myfile.txt";

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

// Read the file from the server & write to destination                
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) // Error here
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))            
using (StreamWriter destination = new StreamWriter(destinationFile))
{
    destination.Write(reader.ReadToEnd());
    destination.Flush();
}

L'erreur est:

  

Le serveur distant a renvoyé une erreur: (550) File indisponible (par exemple, fichier non trouvé, pas d'accès)

Le fichier ne certainement exist sur la machine distante et je suis en mesure d'effectuer ce ftp manuellement (à savoir que j'ai des autorisations). Quelqu'un peut-il me dire pourquoi je pourrais être obtenir cette erreur?

Était-ce utile?

La solution

Ce paragraphe de la classe de référence FptWebRequest de puissance d'intérêt pour vous:

  

L'URI peut être relative ou absolue.   Si l'URI est de la forme   " ftp://contoso.com/%2fpath " (% 2f est   un échappé « / »), l'URI est   absolue, et le répertoire courant est   /chemin. Si, toutefois, l'URI est de   former " ftp://contoso.com/path", premier   le .NET Framework se connecte dans le FTP   serveur (en utilisant le nom d'utilisateur et   mot de passe fixé par les lettres de créance   propriété), le répertoire courant   est réglé sur chemin /.

Autres conseils

Je sais que c'est un vieux post, mais j'ajoute ici pour référence future. Voici une solution que je trouve:

    private void DownloadFileFTP()
    {
        string inputfilepath = @"C:\Temp\FileName.exe";
        string ftphost = "xxx.xx.x.xxx";
        string ftpfilepath = "/Updater/Dir1/FileName.exe";

        string ftpfullpath = "ftp://" + ftphost + ftpfilepath;

        using (WebClient request = new WebClient())
        {
            request.Credentials = new NetworkCredential("UserName", "P@55w0rd");
            byte[] fileData = request.DownloadData(ftpfullpath);

            using (FileStream file = File.Create(inputfilepath))
            {
                file.Write(fileData, 0, fileData.Length);
                file.Close();
            }
            MessageBox.Show("Download Complete");
        }
    }

basée sur une excellente Updated suggestion de Ilya Kogan

Meilleure façon

La façon la plus triviale pour télécharger un fichier binaire à partir d'un serveur FTP en utilisant le framework .NET utilise WebClient.DownloadFile :

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.DownloadFile(
    "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");

Options avancées

FtpWebRequest , seulement si vous avez besoin un contrôle plus que WebClient ne propose pas (comme TLS / SSL cryptage , le suivi des progrès, etc.). Un moyen facile est de copier juste un flux de réponse FTP à l'aide FileStream Stream.CopyTo :

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
    ftpStream.CopyTo(fileStream);
}

Le suivi des progrès

Si vous avez besoin de suivre un cours de téléchargement, vous devez copier le contenu par morceaux vous:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;

using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
    byte[] buffer = new byte[10240];
    int read;
    while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        fileStream.Write(buffer, 0, read);
        Console.WriteLine("Downloaded {0} bytes", fileStream.Position);
    }
}

pour le progrès (GUI WinForms ProgressBar), voir:
Télécharger FtpWebRequest FTP avec ProgressBar


téléchargement du dossier

Si vous voulez télécharger tous les fichiers d'un dossier distant, voir
C # Télécharger tous les fichiers et sous-répertoires via FTP .

J'ai eu le même problème!

Ma solution a été d'insérer le dossier public_html dans l'URL de téléchargement.

A l'emplacement du fichier sur le serveur:

  

myhost.com/public_html/myimages/image.png

Web URL:

  

www.myhost.com/myimages/image.png

    private static DataTable ReadFTP_CSV()
    {
        String ftpserver = "ftp://servername/ImportData/xxxx.csv";
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));

        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

        Stream responseStream = response.GetResponseStream();

        // use the stream to read file from FTP 
        StreamReader sr = new StreamReader(responseStream);
        DataTable dt_csvFile = new DataTable();

        #region Code
        //Add Code Here To Loop txt or CSV file
        #endregion

        return dt_csvFile;

    }

J'espère que cela peut vous aider.

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath);

Après cela, vous pouvez utiliser la ligne ci-dessous pour éviter les erreurs .. (accès refusé etc.)

request.Proxy = null;
   public void download(string remoteFile, string localFile)
    {
       private string host = "yourhost";
       private string user = "username";
       private string pass = "passwd";
       private FtpWebRequest ftpRequest = null;
       private FtpWebResponse ftpResponse = null;
       private Stream ftpStream = null;
       private int bufferSize = 2048;

        try
        {
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);

            ftpRequest.Credentials = new NetworkCredential(user, pass);

            ftpRequest.UseBinary = true;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive = true;

            ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
            ftpStream = ftpResponse.GetResponseStream();

            FileStream localFileStream = new FileStream(localFile, FileMode.Create);

            byte[] byteBuffer = new byte[bufferSize];
            int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);

            try
            {
                while (bytesRead > 0)
                {
                    localFileStream.Write(byteBuffer, 0, bytesRead);
                    bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                }
            }

            catch (Exception) {  }

            localFileStream.Close();
            ftpStream.Close();
            ftpResponse.Close();
            ftpRequest = null;
        }

        catch (Exception) {  }
        return;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top