2012-07-16 187 views
1

我要檢查遠程文件夾的內容,並確定特定文件這個文件夾中是否存在(我只檢查按文件名,所以寒意:d)如何通過FTP檢查遠程文件夾中是否存在文件?

例子:我要檢查,如果該文件夾中/testftp包含一個textfile.txt文件。

我這樣做是爲了讓文件夾的內容:

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create("myftpaddress"); 
     request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 


     request.Credentials = new NetworkCredential("uid", "pass"); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 
     Console.WriteLine(reader.ReadToEnd()); 

     Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription); 

     reader.Close(); 
     response.Close(); 

它寫入控制檯:

-rw-r--r-- 1 6668 userftp 91137 jul 16 23:20 file1.txt 
-rw-r--r-- 1 468 userftp 137 jul 16 18:40 file2.swf 

,並將其寫入全碼流響應到控制檯,如何獲得唯一的文件名?有更容易的方法嗎?

+1

你的問題是http://stackoverflow.com/questions/347897/how-to-check-if-file-exists-on-ftp-的副本before-ftpwebrequest – HatSoft 2012-07-16 22:36:08

回答

1

只是嘗試下載文件會更容易。如果你得到StatusCode表示文件不存在,你就知道它不在那裏。

可能比篩選ListDirectoryDetails的結果要少一些工作。

更新

爲了澄清,所有你需要做的是這樣的:

FtpWebResponse response = (FtpWebResponse) request.GetResponse(); 
bool fileExists = (response.StatusCode != BAD_COMMAND); 

我覺得BAD_COMMAND會FtpStatusCode .CantOpenData,但我不知道。這很容易測試。

+0

如果該文件存在,則會導致下載它的成本。 – 2012-07-16 22:42:51

+0

只有當您調用'reader.ReadToEnd()'時,才需要確定資源是否存在。 – 2012-07-16 22:55:32

+0

我不明白怎麼不調用'reader.ReaderToEnd()'防止FTP服務器發送文件的內容?當然,關閉響應流可能會在收到所有字節之前關閉連接。 – 2012-07-16 23:21:25

0
string listing = reader.ReadToEnd(); 

// find all occurrences of the fileName and make sure 
// it is bounded by white space or string boundary. 

int startIndex = 0; 
bool exists = false; 
while (true) 
{ 
    int index = listing.IndexOf(fileName, startIndex); 
    if (index == -1) break; 

    int leadingIndex = index - 1; 
    int trailingIndex = index + fileName.Length; 

    if ((leadingIndex == -1 || Char.IsWhiteSpace(listing[leadingIndex]) && 
     (trailingIndex == list.Length || Char.IsWhiteSpace(listing[trailingIndex])) 
    { 
     exists = true; 
     break; 
    } 

    startIndex = trailingIndex; 
} 

正則表達式版本:

string pattern = string.Format("(^|\\s){0}(\\s|$)", Regex.Escape(fileName)); 
Regex regex = new Regex(pattern); 

string listing = reader.ReadToEnd(); 
bool exists = regex.IsMatch(listing); 
+1

如果列表包含文件'textfile.txt.old'會怎麼樣?這將錯誤地與您的代碼相匹配。 – 2012-07-16 22:39:12

+0

@EricJ。同意。 :/ – 2012-07-16 22:39:59

+0

您可以使用RegEx與周圍的空格/換行符進行匹配,但只需通過嘗試下載文件來測試文件的存在就可以減少工作量:-) – 2012-07-16 22:40:54

相關問題