64 votes

Comment créer un répertoire sur un serveur ftp en utilisant C #?

Qu'est-ce qu'un moyen facile de créer un répertoire sur un serveur FTP en utilisant C #?

J'ai compris comment télécharger un fichier dans un dossier déjà existant comme ceci:

 using (WebClient webClient = new WebClient())
{
    string filePath = "d:/users/abrien/file.txt";
    webClient.UploadFile("ftp://10.128.101.78/users/file.txt", filePath);
}
 

Cependant, si je veux télécharger sur users/abrien , j'obtiens un WebException indiquant que le fichier est indisponible. Je suppose que cela est dû au fait que je dois créer le nouveau dossier avant de télécharger mon fichier, mais WebClient ne semble pas avoir de méthode pour y parvenir.

108voto

Jon Skeet Points 692016

Utilisez FtpWebRequest , avec une méthode de WebRequestMethods.Ftp.MakeDirectory .

Par exemple:

 using System;
using System.Net;

class Test
{
    static void Main()
    {
        WebRequest request = WebRequest.Create("ftp://host.com/directory");
        request.Method = WebRequestMethods.Ftp.MakeDirectory;
        request.Credentials = new NetworkCredential("user", "pass");
        using (var resp = (FtpWebResponse) request.GetResponse())
        {
            Console.WriteLine(resp.StatusCode);
        }
    }
}
 

37voto

Yannick Richard Points 96

Voici la réponse si vous voulez créer des répertoires imbriqués

Il n'y a pas de moyen propre de vérifier si un dossier existe sur le ftp, vous devez donc boucler et créer toute la structure imbriquée, un dossier à la fois.

 public static void MakeFTPDir(string ftpAddress, string pathToCreate, string login, string password, byte[] fileContents, string ftpProxy = null)
    {
        FtpWebRequest reqFTP = null;
        Stream ftpStream = null;

        string[] subDirs = pathToCreate.Split('/');

        string currentDir = string.Format("ftp://{0}", ftpAddress);

        foreach (string subDir in subDirs)
        {
            try
            {
                currentDir = currentDir + "/" + subDir;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(currentDir);
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(login, password);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                //directory already exist I know that is weak but there is no way to check if a folder exist on ftp...
            }
        }
    }
 

20voto

Fredrik Mörk Points 85694

Quelque chose comme ça:

 // remoteUri points out an ftp address ("ftp://server/thefoldertocreate")
WebRequest request = WebRequest.Create(remoteUri);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
WebResponse response = request.GetResponse();
 

(Un peu tard. Comme c'est étrange.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X