finnTheHumin
finnTheHumin

Reputation: 165

C# Check if FTP Directory EXISTS

I have this FTP Method that checks if a directory exists. It works fine at the start, but now, it's still returning true even if the directory does not exists. I tried many things, and set breakpoint to see what property of the response object I can use to determine whether the directory exists or not. I also searched the internet and the solutions don't seem to work for me. Here is my FTP method.

public bool directoryExists(string directory)
            {
                /* Create an FTP Request */
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                /* Log in to the FTP Server with the User Name and Password Provided */
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                /* Specify the Type of FTP Request */
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                try
                {
                    using (ftpRequest.GetResponse())
                    {
                        return true;
                    }
                    //var response = ftpRequest.GetResponse();
                    //if (response != null)
                    //    return true;
                    //else return false;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    return false;
                }

                /* Resource Cleanup */
                finally
                {
                    ftpRequest = null;
                }
            }

And here is the method that calls it and returns true even if the directory does not exist:

private string getDirectory(ref FtpClass ftp, string internalID)
        {
            string remoteSubPathDel = internalID + "\\trunk\\prod\\xml\\delete";
            string remoteSubPathUpdate = internalID + "\\trunk\\prod\\xml\\update";
            string remoteSubPathNew = internalID + "\\trunk\\prod\\xml\\new";
            if (ftp.directoryExists(remoteSubPathDel))
                return remoteSubPathDel;
            else if (ftp.directoryExists(remoteSubPathUpdate))
                return remoteSubPathUpdate;
            else if (ftp.directoryExists(remoteSubPathNew))
                return remoteSubPathNew;
            else
                return String.Empty;
        }

Hope someone can help. Thanks! :)

Upvotes: 2

Views: 16752

Answers (3)

Wander
Wander

Reputation: 106

In 2021 this works on both our Linux and Windows live boxes reading from ftp server (both on Windows and Linux)

Note

  • the main folder on the Windows ftp is web
  • the main folder on the Linux ftp is public_html

TL;DR;

  • bottom line: the URL needs to be ended with /

It works:

ftp://ftp.yourdomain.com.br/public_html/
ftp://ftp.yourdomain.com.br//public_html/
ftp://ftp.yourdomain.com.br/web/
ftp://ftp.yourdomain.com.br//web/

It doesn't work:

ftp://ftp.yourdomain.com.br/public_html
ftp://ftp.yourdomain.com.br//public_html
ftp://ftp.yourdomain.com.br/web
ftp://ftp.yourdomain.com.br//web

Usage: //verifiy if the directory public_html does exists

var url = "/public_html/";
var result = FtpUtil.DoesDirectoryExists(url,  "ftp://ftp.yourdomain.com.br", "ftp user here", "ftp password here");

static bool DoesDirectoryExists(string directory, string ftpHost, string ftpUser, string ftpPassword) {
                    FtpWebRequest ftpRequest = null;
                    try {
                            ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + ftpHost + directory));
                            ftpRequest.Credentials = new NetworkCredential(ftpUser, string ftpPassword);
                            ftpRequest.UseBinary = true;// optional
                            ftpRequest.KeepAlive = false;// optional
                            ftpRequest.UsePassive = true;// optional
                            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
        
                            using (FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse()) {
                                return true;//directory found
                            }
                    }
                    catch (WebException ex) {
                            if (ex.Response != null) {
                                FtpWebResponse response = (FtpWebResponse)ex.Response;
                                if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                                    return false;// directory not found.  
                            }
                            return false; // directory not found.
                    }
                    finally {
                        ftpRequest = null;
                    }
        }

Upvotes: 0

finnTheHumin
finnTheHumin

Reputation: 165

I got a work around for this problem. Not the best looking but it works.

Maybe this can help others with the same problem as mine.

public bool directoryExists2(string directory, string mainDirectory)
        {
            try
            {
                var list = this.GetFileList(mainDirectory);
                if (list.Contains(directory))
                    return true;
                else
                    return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }

EDIT: I included the GetFileList method in response to Ray Chang's comment

public string[] GetFileList(string path)
        {
            var ftpPath = host + "/" + path;
            var ftpUser = user;
            var ftpPass = pass;
            var result = new StringBuilder();
            try
            {
                var strLink = ftpPath;
                var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(strLink));
                reqFtp.UseBinary = true;
                reqFtp.Credentials = new NetworkCredential(ftpUser, ftpPass);
                reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
                reqFtp.Proxy = null;
                reqFtp.KeepAlive = false;
                reqFtp.UsePassive = true;
                using (var response = reqFtp.GetResponse())
                {
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        var line = reader.ReadLine();
                        while (line != null)
                        {
                            result.Append(line);
                            result.Append("\n");
                            line = reader.ReadLine();
                        }
                        result.Remove(result.ToString().LastIndexOf('\n'), 1);
                    }
                }
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                Console.WriteLine("FTP ERROR: ", ex.Message);
                return null;
            }

            finally
            {
                ftpRequest = null;
            }
        }

Upvotes: 8

roybalderama
roybalderama

Reputation: 1640

Try this:

public bool directoryExists(string directory)
{
    /* Create an FTP Request */
    ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
    /* Log in to the FTP Server with the User Name and Password Provided */
    ftpRequest.Credentials = new NetworkCredential(user, pass);
    /* Specify the Type of FTP Request */
    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    try
    {
        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            return true;
        }
    }
    catch (Exception ex)
    {
        return false;
    }

            /* Resource Cleanup */
    finally
    {
        ftpRequest = null;
    }
}

Take note of this line using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())

Upvotes: 1

Related Questions