Search code examples
c#ftpdirectoryexists

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! :)


Solution

  • 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;
                }
            }