如何在FtpWebRequest之前检查FTP上是否存在文件
问题描述:
我需要使用FtpWebRequest将文件放入FTP目录中。在上传之前,我首先想知道这个文件是否存在。如何在FtpWebRequest之前检查FTP上是否存在文件
我应该使用什么方法或属性来检查此文件是否存在?
答
var request = (FtpWebRequest)WebRequest.Create
("ftp://ftp.domain.com/doesntexist.txt");
request.Credentials = new NetworkCredential("user", "pass");
request.Method = WebRequestMethods.Ftp.GetFileSize;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode ==
FtpStatusCode.ActionNotTakenFileUnavailable)
{
//Does not exist
}
}
一般来说这是一个坏主意,使用功能异常在你的代码这样的,但是在这种情况下,我相信它是实用主义的胜利。目录上的调用列表可能会比以这种方式使用异常更为低效。
如果你不是,只是意识到这不是好的做法!
编辑:“它适合我!”
这似乎适用于大多数FTP服务器,但不是全部。某些服务器需要在SIZE命令工作之前发送“TYPE I”。人们会认为这个问题应该可以解决如下:
request.UseBinary = true;
不幸的是它是一个由设计限制(大发错误!),除非的FtpWebRequest或者是下载或上传文件时,它不会发送“TYPE I ”。请参阅讨论和Microsoft响应here。
我建议使用下面的WebRequestMethod代替,这对我测试的所有服务器都适用,即使是那些不会返回文件大小的服务器。
WebRequestMethods.Ftp.GetDateTimestamp
答
因为在一些情况下(550:SIZE ASCII模式不允许)
request.Method = WebRequestMethods.Ftp.GetFileSize
5月失败,你可以检查时间戳来代替。
reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;
答
我用FTPStatusCode.FileActionOK检查文件是否存在...
届时, “其他” 部分中,返回false。
你好, 我已经把我的用户,我的密码,并设置我的URI。 文件存在,但此代码表明它不存在 – 2008-12-08 07:48:38