我需要使用FtpWebRequest將文件放入FTP目錄中。在上傳之前,我首先想知道這個文件是否存在。如何在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