2008-12-07 188 views

回答

100
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 
+0

你好, 我已经把我的用户,我的密码,并设置我的URI。 文件存在,但此代码表明它不存在 – 2008-12-08 07:48:38

4

因为在一些情况下(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; 
0

我用FTPStatusCode.FileActionOK检查文件是否存在...

届时, “其他” 部分中,返回false。

相关问题