web-dev-qa-db-fra.com

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

Quel est un moyen simple 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 celui-ci:

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 souhaite télécharger vers users/abrien, J'obtiens un WebException indiquant que le fichier n'est pas disponible. Je suppose que c'est parce 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.

61
Anthony Brien

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);
        }
    }
}
104
Jon Skeet

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

Il n'y a aucun 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...
            }
        }
    }
33
Yannick Richard

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

20
Fredrik Mörk