当前位置: 首页 > 知识库问答 >
问题:

如何确定FTP目录是否存在

太叔凌龙
2023-03-14

我编写了以下代码来检测目录是否存在。方法接受完全限定路径或相对路径。

public bool DirectoryExists(string directory)
{
    try
    {
        FtpWebRequest request = GetRequest(directory);
        request.Method = WebRequestMethods.Ftp.ListDirectory;

        using (FtpWebResponse response = request.GetResponse() as FtpWebResponse)
        using (StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII))
        {
            sr.ReadToEnd();
        }
        return true;
    }
    catch { }
    return false;
}

protected FtpWebRequest GetRequest(string filename = "")
{
    FtpWebRequest request = WebRequest.Create(_host.GetUrl(filename)) as FtpWebRequest;
    request.Credentials = new NetworkCredential(Username, Password);
    request.Proxy = null;
    request.KeepAlive = false;
    return request;
}

注意:\u主机。GetUrl(filename)返回指定目录或文件名的完全限定路径。在我的例子中,这是ftp://www.mydomain.com/Articles/controls/precisely-defining-kilobytes-megabytes-and-gigabytes

这个代码已经运行了好几个月了。但它突然停止了工作。现在,当目录不存在时,DirectoryExists中不会出现异常sr.ReadToEnd()只返回一个空字符串。

我发布了一个类似的问题,有人建议我应该总是在路径的末尾追加/。我试过了,以为我有一次例外,但现在没有例外。

我不知道与我通信的FTP服务器上的行为是否发生了变化。再说一次,当我写它的时候,它工作得很好,但现在它没有。

如何确定FTP目录是否存在?

编辑:

调用ReadToEnd()后检查响应,我看到:

BannerMessage="220微软FTP服务\r\n"

ContentLength=-1

ExitMessage="221再见。\r\n"

关闭数据

StatusDescription=“226传输完成。\r\n”

欢迎消息="230用户已登录。\r\n"

更新:

最终,我看到大多数人都在推荐我最初所做的变化。这为汉斯·帕桑特的建议增加了分量,即问题在于服务器。我试图让他们看看这个,但他们似乎对整个讨论有点困惑。我知道他们正在使用微软服务器,我怀疑我能否从他们那里得到解决方案。

如果所有其他方法都失败了,我认为答案是列出父目录,这确实需要一些额外的工作来处理一些情况,例如当有问题的目录是根目录时,以及当父目录不存在时。

共有3个答案

那正初
2023-03-14

我有类似的代码,可以通过FTP将项目部署到IIS 6/Windows 2003服务器。这工作得很好,直到我把它指向IIS7/Windows 2008服务器。我开始看到和你完全一样的行为。我调试了它,并最终将我的代码更改为以下内容。这是我的代码中的一个直接片段。如果您愿意,我可以包含它调用的方法中的源,但我认为您理解这些操作。

try
{
    //Get a recursive FTP Listing
    items = GetFtpListing(target, true);
}
catch(WebException e)
{
    if (string.Equals(e.Message, "The remote server returned an error: (550) File unavailable (e.g., file not found, no access)."))
    {
        CreateRemoteDirectory(target);
        items = GetFtpListing(target, true);
    }
    else
    {
        throw e;
    }
}

GetFtpListing的相关部分

List<string> ftpRawList = new List<string>();

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(path);
request.Timeout = 60000;
request.ReadWriteTimeout = 60000;
request.Credentials = this.credentials;
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
    Stream data = response.GetResponseStream();

    using (StreamReader reader = new StreamReader(data))
    {
        string responseString = reader.ReadToEnd();
        ftpRawList.AddRange(responseString.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
    }
易琛
2023-03-14

这可能是因为服务器上安装了FTP服务器软件。

否则,您可能想看看响应。StatusCode查看是否有任何提示。

http://msdn.microsoft.com/en-us/library/system.net.ftpstatuscode(v=vs.110)

最后,如果所有这些都不起作用,试着在那个不存在的目录上写一个愚蠢的文本文件。

闻人嘉颖
2023-03-14

当您请求不存在的目录/文件时,FTP服务器会回复550消息。此550在中转换为异常。网

关于您介绍的代码,我不认为有理由在生产中使用StreamReader。一个简单的修改如下:

public bool DirectoryExists(string directory)
{
  try
  {
    FtpWebRequest request = GetRequest(directory);
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    return request.GetResponse() != null;
  }
  catch
  {
    return false;
  }
}

我保留了异常处理(缺失),但我建议您处理它,因为有许多不同的情况需要捕获,这些情况与ftp响应无关。

请求。如果该目录不存在,GetContent()将生成异常。

我尝试了以下路径,以获得真正的回报:

  • ftp://ftp.mozilla.org/
  • ftp://ftp.mozilla.org/pub/
  • ftp://ftp.mozilla.org/pub/data/
  • ftp://ftp.mozilla.org/pub/data/bloat-reports/

最后一个是一个现有但空的目录

ftp://ftp.mozilla.org/pub/data/bloat-reports2/返回false

有一个很大但关于尾随/在路径。

mozilla。org是pub目录下的一个零字节长的文件

ftp://ftp.mozilla.org/pub/mozilla.org返回true

ftp://ftp.mozilla.org/pub/mozilla.org/返回false,然后返回true?????

此行为与您描述的类似。您可以在浏览器上轻松地复制它。我建议您对自己的路径也这样做,并检查目录的内容。如果确实有空文件,请删除它们或用空格替换其内容,最后检查代码以确保不会创建新文件或以零字节长度重新创建它们。

我希望这能有所帮助。

使现代化

没有消息,坏消息!我想以上这些对你都没有帮助。也许在你的人生道路上再上一层就能解决这个问题。其思想是获取父目录的列表,并检查其子目录名。如果父路径有效,则应始终返回非空字符串。代码如下:

static bool DirectoryExists(string directory)
{
    try
    {
        directory = GetRequest(directory);
        string
            parent = directory.Substring(0, directory.TrimEnd('/').LastIndexOf('/') + 1),
            child = directory.Substring(directory.TrimEnd('/').LastIndexOf('/') + 1).TrimEnd('/');
        FtpWebRequest request = GetRequest(parent);
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        using (FtpWebResponse response = request.GetResponse() as FtpWebResponse)
        {
            if (response == null)
                return false;
            string data = new StreamReader(response.GetResponseStream(), true).ReadToEnd();
            return data.IndexOf(child, StringComparison.InvariantCultureIgnoreCase) >= 0;
        }
    }
    catch
    {
        return false;
    }
}

如您所见,没有必要担心尾随斜杠。

警告:该代码不适用于同一路径下具有相同名称的子目录和文件名的情况。

 类似资料:
  • 问题内容: 我有一个需要用户输入密码的应用程序。 我想要做的是从控制台读取密码(如果操作系统支持unix)或显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面(例如Windows))。 有人可能会争辩说,在上述两种情况下控制台始终可用,因此控制台输入就足够了。但是问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一

  • 本文向大家介绍java判断ftp目录是否存在的方法,包括了java判断ftp目录是否存在的方法的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了java判断ftp目录是否存在的方法,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 如何检查C语言在Linux上是否存在目录? 问题答案: 您可以使用并检查是否失败:

  • 问题内容: 在JMS中,很容易找出连接是否丢失,是否发生异常。但是,如何确定连接是否再次存在? 场景:我使用JMS与服务器通信。现在我的连接断开了(服务器已关闭),这导致了异常。到目前为止,一切都很好。如果服务器再次启动并重新建立连接,我怎么知道? 我看不到任何可以提供此类信息的侦听器。 问题答案: 啊…旧的异常处理/重新连接难题。 有些传输提供程序将为您自动重新连接您的应用程序,而另一些传输提供

  • 问题内容: 由于ResultSet包含从动态SQL返回的数据,是否有任何方法可以确定ResultSet是否包含特定的列名?例如,如果我运行但Column_ABC确实不存在,它将抛出异常。如何测试ResultSet是否可以从名为“ Column_ABC”的列中获取数据? 问题答案: 使用该类。 我不明白的是为什么会需要此功能。正在执行的查询或存储过程应具有已知结果。查询的列应该是已知的。需要这样的功

  • 问题内容: 我想检查我的Go代码中文件的存在,但是我找不到一种好的方法。 我知道有一种Java中的File方法:如果文件或目录存在,则返回true。 但是如何在Go中完成呢? 问题答案: 编辑以添加错误处理。