我编写了以下代码来检测目录是否存在。方法接受完全限定路径或相对路径。
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"
更新:
最终,我看到大多数人都在推荐我最初所做的变化。这为汉斯·帕桑特的建议增加了分量,即问题在于服务器。我试图让他们看看这个,但他们似乎对整个讨论有点困惑。我知道他们正在使用微软服务器,我怀疑我能否从他们那里得到解决方案。
如果所有其他方法都失败了,我认为答案是列出父目录,这确实需要一些额外的工作来处理一些情况,例如当有问题的目录是根目录时,以及当父目录不存在时。
我有类似的代码,可以通过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));
}
这可能是因为服务器上安装了FTP服务器软件。
否则,您可能想看看响应。StatusCode查看是否有任何提示。
http://msdn.microsoft.com/en-us/library/system.net.ftpstatuscode(v=vs.110)
最后,如果所有这些都不起作用,试着在那个不存在的目录上写一个愚蠢的文本文件。
当您请求不存在的目录/文件时,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/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”的列中获取数据? 问题答案: 使用该类。 我不明白的是为什么会需要此功能。正在执行的查询或存储过程应具有已知结果。查询的列应该是已知的。需要这样的功
问题内容: Python具有运行FTP通信的标准库模块。它有两种获取目录内容列表的方法。一个会返回给定目录名称作为参数的目录内容列表。(如果给定文件名,它将返回文件名。)这是列出目录内容的可靠方法,但不提供任何指示列表中的每个项目是文件还是目录。另一个方法是,它以字符串格式列出作为参数给出的目录的目录内容(或给定文件名的文件属性)。 根据上一个关于Stack Overflow的问题,解析的结果可能