2008-12-07 25 views

Trả lời

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 
    } 
} 

Nguyên tắc chung là sử dụng Ngoại lệ cho chức năng trong mã của bạn như thế này, tuy nhiên trong trường hợp này, tôi tin rằng đó là chiến thắng cho chủ nghĩa thực dụng. Danh sách cuộc gọi trên thư mục có khả năng trở nên kém hiệu quả hơn so với sử dụng các ngoại lệ theo cách này.

Nếu không, hãy lưu ý rằng đó không phải là cách thực hành tốt!

EDIT: "Nó phù hợp với tôi!"

Điều này dường như hoạt động trên hầu hết các máy chủ FTP nhưng không phải tất cả. Một số máy chủ yêu cầu gửi "TYPE I" trước khi lệnh SIZE hoạt động. Ai có thể nghĩ rằng vấn đề cần được giải quyết như sau:

request.UseBinary = true; 

Đáng tiếc là nó là một bằng giới hạn thiết kế (lớn lỗi chất béo!) Rằng trừ khi FtpWebRequest là một trong hai tải hoặc tải lên một tập tin nó sẽ KHÔNG gửi "LOẠI I ". Xem thảo luận và phản hồi của Microsoft here.

Tôi khuyên bạn nên sử dụng WebRequestMethod sau để thay thế, điều này làm việc cho tôi trên tất cả các máy chủ tôi đã thử nghiệm, ngay cả những máy chủ không trả về kích thước tệp.

WebRequestMethods.Ftp.GetDateTimestamp 
+0

Xin chào, Tôi đã đặt người dùng và mật khẩu của mình và đặt URI của tôi. Tệp tồn tại nhưng mã này cho biết rằng nó không tồn tại –

+2

Bạn thực sự là một idius thiên tài! Nó hoạt động như một say mê! –

+0

@ user42467, Có bất kỳ lý do nào để đưa phản hồi FtpWebResponse = (FtpWebResponse) request.GetResponse(); bên trong thử, thay vì chỉ request.GetResponse(); – Daniel

4

request.Method = WebRequestMethods.Ftp.GetFileSize 

may thất bại trong một số trường hợp (550: SIZE không được phép trong chế độ ASCII), bạn chỉ có thể kiểm tra Timestamp để thay thế.

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

tôi sử dụng FTPStatusCode.FileActionOK để kiểm tra nếu tập tin tồn tại ...

sau đó, trong phần "khác", trả về false.

Các vấn đề liên quan