web-dev-qa-db-fra.com

Comment vérifier si un répertoire FTP existe

Vous cherchez la meilleure façon de vérifier un répertoire donné via FTP.

Actuellement, j'ai le code suivant:

private bool FtpDirectoryExists(string directory, string username, string password)
{

    try
    {
        var request = (FtpWebRequest)WebRequest.Create(directory);
        request.Credentials = new NetworkCredential(username, password);
        request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    }
    catch (WebException ex)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;
        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            return false;
        else
            return true;
    }
    return true;
}

Cela renvoie false que le répertoire soit là ou non. Quelqu'un peut me diriger dans la bonne direction.

29
Billy Logan

Fondamentalement piégé l'erreur que je reçois lors de la création du répertoire comme ça.

private bool CreateFTPDirectory(string directory) {

    try
    {
        //create the directory
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory));
        requestDir.Method = WebRequestMethods.Ftp.MakeDirectory;
        requestDir.Credentials = new NetworkCredential("username", "password");
        requestDir.UsePassive = true;
        requestDir.UseBinary = true;
        requestDir.KeepAlive = false;
        FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse();
        Stream ftpStream = response.GetResponseStream();

        ftpStream.Close();
        response.Close();

        return true;
    }
    catch (WebException ex)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;
        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
        {
            response.Close();
            return true;
        }
        else
        {
            response.Close();
            return false;
        }  
    }
}
18
Billy Logan

Je suppose que vous connaissez déjà un peu FtpWebRequest, car c'est la façon habituelle d'accéder à FTP dans .NET.

Vous pouvez essayer de répertorier le répertoire et rechercher une erreur StatusCode.

    try 
{  
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.Microsoft.com/12345");  
    request.Method = WebRequestMethods.Ftp.ListDirectory;  
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())  
    {  
        // Okay.  
    }  
}  
catch (WebException ex)  
{  
    if (ex.Response != null)  
    {  
        FtpWebResponse response = (FtpWebResponse)ex.Response;  
        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)  
        {  
            // Directory not found.  
        }  
    }  
} 
8
Mahdi

J'étais également coincé avec le même problème. J'utilisais,

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpserver.com/rootdir/test_if_exist_directory");  
request.Method = WebRequestMethods.Ftp.ListDirectory;  
FtpWebResponse response = (FtpWebResponse)request.GetResponse();

et attendu l'exception au cas où le répertoire n'existe pas. Cette méthode n'a pas levé d'exception.

Après quelques hit et essais, j'ai changé le répertoire de: " ftp://ftpserver.com/rootdir/test_if_exist_directory " en: " ftp://ftpserver.com/rootdir/test_if_exist_directory / ". Maintenant, cette pièce fonctionne pour moi.

Je pense que nous devrions ajouter une barre oblique inverse (/) dans l'URI du dossier ftp pour obtenir ce travail.

Comme demandé, la solution complète sera désormais:

public bool DoesFtpDirectoryExist(string dirPath)
{
    try
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(dirPath);  
        request.Method = WebRequestMethods.Ftp.ListDirectory;  
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        return true;
     }
     catch(WebException ex)
     {
         return false;
     }
}

//Calling the method:
string ftpDirectory = "ftp://ftpserver.com/rootdir/test_if_exist_directory/"; //Note: backslash at the last position of the path.
bool dirExists = DoesFtpDirectoryExist(ftpDirectory);
8
Bikash

Je voudrais essayer quelque chose dans ce sens:

  • Envoyer la commande FTP <directory> MLST (définie dans RFC3659) et analyser sa sortie. Il doit renvoyer une ligne valide avec les détails du répertoire pour les répertoires existants.

  • Si la commande MLST n'est pas disponible, essayez de changer le répertoire de travail dans le répertoire testé à l'aide d'une commande CWD. N'oubliez pas de déterminer le chemin actuel (commande PWD) avant de passer à un répertoire testé pour pouvoir revenir en arrière.

  • Sur certains serveurs, la combinaison de MDTM et de la commande SIZE peut être utilisée à des fins similaires, mais le comportement est assez complexe et hors de portée de cet article.

C'est essentiellement ce que fait la méthode DirectoryExists dans la version actuelle de notre composant FTP Rebex . Le code suivant montre comment l'utiliser:

string path = "/path/to/directory";

Rebex.Net.Ftp ftp = new Rebex.Net.Ftp();
ftp.Connect("hostname");
ftp.Login("username","password");

Console.WriteLine(
  "Directory '{0}' exists: {1}", 
  path, 
  ftp.DirectoryExists(path)
);

ftp.Disconnect();
6
Martin Vobr

Utilisez ce code, cela peut être votre réponse.

 public bool FtpDirectoryExists(string directoryPath, string ftpUser, string ftpPassword)
        {
            bool IsExists = true;
            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(directoryPath);
                request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                IsExists = false;
            }
            return IsExists;
        }

J'ai appelé cette méthode comme:

bool result =    FtpActions.Default.FtpDirectoryExists( @"ftp://mydomain.com/abcdir", txtUsername.Text, txtPassword.Text);

Pourquoi utiliser une autre bibliothèque - créez votre propre logique.

4
Niranjan Singh

J'ai essayé par tous les moyens d'obtenir un chèque solide, mais ni le WebRequestMethods.Ftp.PrintWorkingDirectory ni WebRequestMethods.Ftp.ListDirectory les méthodes fonctionneraient correctement. Ils ont échoué lors de la vérification de ftp://<website>/Logs qui n'existe pas sur le serveur mais ils disent que oui.

Donc, la méthode que j'ai trouvée était d'essayer de télécharger dans le dossier. Cependant, un 'gotcha' est le format de chemin que vous pouvez lire dans ce fil Téléchargement vers Linux

Voici un extrait de code

private bool DirectoryExists(string d) 
{ 
    bool exists = true; 
    try 
    { 
        string file = "directoryexists.test"; 
        string path = url + homepath + d + "/" + file;
        //eg ftp://website//home/directory1/directoryexists.test
        //Note the double space before the home is not a mistake

        //Try to save to the directory 
        req = (FtpWebRequest)WebRequest.Create(path); 
        req.ConnectionGroupName = "conngroup1"; 
        req.Method = WebRequestMethods.Ftp.UploadFile; 
        if (nc != null) req.Credentials = nc; 
        if (cbSSL.Checked) req.EnableSsl = true; 
        req.Timeout = 10000; 

        byte[] fileContents = System.Text.Encoding.Unicode.GetBytes("SAFE TO DELETE"); 
        req.ContentLength = fileContents.Length; 

        Stream s = req.GetRequestStream(); 
        s.Write(fileContents, 0, fileContents.Length); 
        s.Close(); 

        //Delete file if successful 
        req = (FtpWebRequest)WebRequest.Create(path); 
        req.ConnectionGroupName = "conngroup1"; 
        req.Method = WebRequestMethods.Ftp.DeleteFile; 
        if (nc != null) req.Credentials = nc; 
        if (cbSSL.Checked) req.EnableSsl = true; 
        req.Timeout = 10000; 

        res = (FtpWebResponse)req.GetResponse(); 
        res.Close(); 
    } 
    catch (WebException ex) 
    { 
        exists = false; 
    } 
    return exists; 
} 
2
Christian

Accédez au répertoire parent, exécutez la commande "ls" et analysez le résultat.

0

Je n'ai pas pu faire fonctionner cette suggestion @BillyLogans ....

J'ai trouvé que le problème était que le répertoire FTP par défaut était/home/usr/fred

Quand j'ai utilisé:

String directory = "ftp://some.domain.com/mydirectory"
FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(directory));

J'ai trouvé que cela se transformait en

"ftp:/some.domain.com/home/usr/fred/mydirectory"

pour arrêter cela, changez le répertoire Uri en:

String directory = "ftp://some.domain.com//mydirectory"

Ensuite, cela commence à fonctionner.

0
AnthonyLambert