gpt4 book ai didi

c# - 如何判断 FTP 目录是否存在

转载 作者:太空狗 更新时间:2023-10-29 23:07:25 25 4
gpt4 key购买 nike

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

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

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

这段代码已经工作了很多个月。但突然间它停止工作了。现在,当目录不存在时,DirectoryExists 中不会引发异常。 sr.ReadToEnd() 只是返回一个空字符串。

我发布了一个类似的问题,有人建议我应该始终将 / 附加到路径的末尾。我试过了,以为我遇到过一次异常,但现在没有引发异常。

我不知道我正在与之通信的 FTP 服务器上的行为是否发生了变化或发生了什么。同样,当我编写它时它运行良好,但现在它不起作用。

如何判断FTP目录是否存在?

编辑:

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

BannerMessage="220 Microsoft FTP Service\r\n"

ContentLength=-1

ExitMessage="221 Goodbye.\r\n"

StatusCode=ClosingData

StatusDescription="226 Transfer complete.\r\n"

WelcomeMessage="230 User logged in.\r\n"

更新:

最终,我看到大多数人都在推荐我最初所做的变化。这为 Hans Passant 认为问题出在服务器上的建议提供了依据。我试图让他们看看这个,但他们似乎对整个讨论有点困惑。我知道他们使用的是 Microsoft 服务器,我怀疑能否从他们那里获得解决方案。

如果一切都失败了,我认为答案是列出父目录,这确实需要一些额外的工作来处理诸如所讨论的目录是根目录的情况,以及父目录不是目录的情况。不存在。

最佳答案

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

关于您提供的代码,我看不出在生产中使用 StreamReader 的原因。一个简单的修改如下:

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

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

如果目录不存在,request.GetResponse() 将产生异常。

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

最后一个是一个已经存在但为空的目录

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

路径中有一个很大但关于尾随/的地方。

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

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

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

如您所见,无需担心尾部斜线。

警告:该代码不会涵盖同一路径下同名的子目录和文件名的情况。

关于c# - 如何判断 FTP 目录是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24761583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com