How to check if an FTP directory exists

前端 未结 10 1345
一个人的身影
一个人的身影 2020-12-01 10:26

Looking for the best way to check for a given directory via FTP.

Currently i have the following code:

private bool FtpDirectoryExists(string direct         


        
相关标签:
10条回答
  • 2020-12-01 11:10

    For what it is worth, You'll make your FTP life quite a bit easier if you use EnterpriseDT's FTP component. It's free and will save you headaches because it deals with the commands and responses. You just work with a nice, simple object.

    0 讨论(0)
  • 2020-12-01 11:14

    I tried every which way to get a solid check but neither the WebRequestMethods.Ftp.PrintWorkingDirectory nor WebRequestMethods.Ftp.ListDirectory methods would work correctly. They failed when checking for ftp://<website>/Logs which doesnt exist on the server but they say it does.

    So the method I came up with was to try to upload to the folder. However, one 'gotcha' is the path format which you can read about in this thread Uploading to Linux

    Here is a code snippet

    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; 
    } 
    
    0 讨论(0)
  • 2020-12-01 11:15

    I was also stuck with a similar problem. I was using,

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

    and waited for an exception in case the directory didn't exist. This method didn't throw an exception.

    After a few hit and trials, I changed the directory from: "ftp://ftpserver.com/rootdir/test_if_exist_directory" to: "ftp://ftpserver.com/rootdir/test_if_exist_directory/". Now the code is working for me.

    I think we should append forwardslash (/) to the URI of the ftp folder to get it to work.

    As requested, the complete solution will now be:

    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 (note the forwardslash at the end of the path):
    string ftpDirectory = "ftp://ftpserver.com/rootdir/test_if_exist_directory/";
    bool dirExists = DoesFtpDirectoryExist(ftpDirectory);
    
    0 讨论(0)
  • 2020-12-01 11:17

    I would try something along this lines:

    • Send MLST <directory> FTP command (defined in RFC3659) and parse it's output. It should return valid line with directory details for existing directories.

    • If MLST command is not available, try changing the working directory into the tested directory using a CWD command. Don't forget to determine the current path (PWD command) prior to changing to a tested directory to be able to go back.

    • On some servers combination of MDTM and SIZE command can be used for similar purpose, but the behavior is quite complex and out of scope of this post.

    This is basically what DirectoryExists method in the current version of our Rebex FTP component does. The following code shows how to use it:

    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();
    
    0 讨论(0)
提交回复
热议问题