2

ディレクトリが存在するかどうかを確認するこの FTP メソッドがあります。最初は問題なく動作しましたが、ディレクトリが存在しなくても true を返すようになりました。私は多くのことを試し、ディレクトリが存在するかどうかを判断するために使用できる応答オブジェクトのプロパティを確認するためにブレークポイントを設定しました。インターネットも検索しましたが、解決策がうまくいかないようです。これが私のFTPメソッドです。

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

そして、ディレクトリが存在しない場合でもそれを呼び出して true を返すメソッドは次のとおりです。

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

誰かが助けてくれることを願っています。ありがとう!:)

4

3 に答える 3

7

この問題の回避策があります。見栄えはよくありませんが、機能します。

たぶん、これは私と同じ問題を抱えている他の人を助けることができます.

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

編集: Ray Chang のコメントに応じて GetFileList メソッドを含めました

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;
            }
        }
于 2013-05-24T05:09:11.117 に答える
1

これを試して:

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

この行に注意してくださいusing (FtpWebResponse response = (FtpWebResponse)request.GetResponse())

于 2013-05-24T03:32:59.457 に答える