2008-12-07 193 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。

相關問題