如何在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 } } 

一般来说,在你的代码中使用例外function是个不错的主意,但在这种情况下,我相信这是实用主义的胜利。 目录上的调用列表可能会比以这种方式使用exception更为低效。

如果你不是,只要意识到这不是好的做法!

编辑:“它为我工作!”

这似乎在大多数ftp服务器上工作,但不是全部。 一些服务器需要在SIZE命令工作之前发送“TYPE I”。 有人会认为这个问题应该解决如下:

 request.UseBinary = true; 

不幸的是,这是一个devise限制(大胖子!),除非FtpWebRequest是下载或上传文件,它不会发送“typesI”。 请参阅此处的讨论和Microsoft响应。

我build议使用下面的WebRequestMethod来代替,这对我testing的所有服务器都适用,即使是那些不会返回文件大小的服务器。

 WebRequestMethods.Ftp.GetDateTimestamp 

因为

 request.Method = WebRequestMethods.Ftp.GetFileSize 

在某些情况下可能会失败(550:SIZE不允许在ASCII模式下),您可以直接检查Timestamp。

 reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password); reqFTP.UseBinary = true; reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;