2009-12-18 28 views
68

Snow Leopard đã giới thiệu nhiều phương pháp mới để sử dụng các đối tượng NSURL để tham chiếu đến tệp, không phải tên đường dẫn hoặc FSRef của Dịch vụ cốt lõi.Kiểm tra sự tồn tại của tệp bằng cách sử dụng NSURL

Tuy nhiên, có một tác vụ tôi không thể tìm thấy phương pháp dựa trên URL cho: Kiểm tra xem tệp có tồn tại hay không. Tôi đang tìm phiên bản dựa trên URL của -[NSFileManager fileExistsAtPath:]. Giống như phương thức đó, nó phải trả lại YES nếu URL mô tả bất kỳ thứ gì, cho dù đó là tệp thông thường, thư mục hay bất kỳ thứ gì khác.

Tôi có thể tìm kiếm nhiều loại resource values, nhưng không ai trong số chúng được bảo đảm rõ ràng nếu không có tệp và một số tệp (ví dụ: NSURLEffectiveIconKey) có thể tốn kém nếu có.

Tôi chỉ có thể sử dụng fileExistsAtPath: của NSFileManager, nhưng nếu có phương pháp hiện đại hơn, tôi muốn sử dụng phương pháp đó hơn.

Có phương pháp hay chức năng đơn giản nào trong Cocoa, CF hoặc Dịch vụ cốt lõi được đảm bảo/tài liệu để cho tôi biết liệu URL đã cho (hoặc tệp tham chiếu) có liên quan đến đối tượng hệ thống tệp không?

Trả lời

130

NSURL không có phương pháp này: "Returns liệu tài nguyên được trỏ đến bởi một URL tập tin có thể đạt được"

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error 

nào

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
       isDirectory:NO]; 
NSError *err; 
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) 
    [[NSAlert alertWithError:err] runModal]; 
+3

Đối với bất kỳ nhà phát triển hệ điều hành iPhone nào bị loại bỏ bởi câu trả lời này: 'checkResourceIsReachableAndReturnError:' chỉ có sẵn trong 10.6 trở lên và chưa có trong SDK iPhone. –

+4

Cập nhật: Nó có sẵn dưới dạng iOS 4. –

+2

Tài liệu iOS ở trạng thái XCode 3.2.5 (hỗ trợ iOS 4.2): "Phương pháp này chưa được triển khai trong iOS, vì vậy nó không hoạt động." – Daniel

1

Vì NSURL có thể đại diện cho nhiều hệ thống tệp cục bộ hơn, tôi không nghĩ rằng có một phương pháp chung có thể kiểm tra sự tồn tại của chúng một cách đáng tin cậy. Ít nhất, nền tảng Ca cao không chứa một chức năng như vậy (theo như tôi biết).

Nếu bạn chỉ xử lý các hệ thống tệp cục bộ, tôi khuyên bạn nên tạo danh mục cho NSURL hoặc cho NSFileManager, với thông báo urlExists:. Nó sẽ chuyển đổi NSURL thành NSString (đường chuẩn hóa) và sau đó gọi thông báo [NSFileManager fileExistsAtPath:].

+0

Bạn có thể ghép đôi 'checkResourceIsReachableAndReturn nói trên Lỗi: 'with' isFileURL' để giữ cho nó được sane. –

2

Xác định nếu một tập tin nhất định (hoặc tập tin tham khảo) URL chuyển đến một đối tượng tập tin hệ thống tồn tại vốn đã tốn kém cho các nguồn lực từ xa, 10,6 chỉ (không iPhoneOS) của api cho CFURLResourceIsReachable này() và [ NSURL checkResourceIsReachableAndReturnError:] đều đồng bộ, ngay cả khi bạn sẽ sử dụng chúng, cho rất nhiều tệp bạn vẫn sẽ xem xét chi phí trì hoãn đáng kể.

Điều bạn cần làm là triển khai quy trình kiểm tra không đồng bộ của riêng bạn với bộ nhớ đệm để tạo riêng một danh sách các tài nguyên hợp lệ.

Nếu không ghi chú cho CFURLResourceIsReachable trong tình trạng tiêu đề:

An example would be periodic maintenance of UI state that depends on the existence of a particular document. When performing an operation such as opening a file, it is more efficient to simply try the operation and handle failures than to check first for reachability.

+1

Tôi nghi ngờ nó rất chậm ... NSURL duy trì liên kết đến mục nhập hệ thống tệp HFS + mà nó đại diện. Theo Apple, các URL là * nhiều * nhanh hơn đường dẫn cho tất cả các hoạt động của hệ thống tập tin. –

29

Trên iOS Tôi không thể tìm thấy bất kỳ cách nào khác ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...} 
9

Đây là Swift 2 câu trả lời:

var error:NSError? 
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error) 
+0

Nó phải là 'checkResourceIsReachable() -> Void' và ném ngoại lệ, tuy nhiên, những gì bạn nói là chính xác cho Xcode 7.x –

+0

* lỗi ném. Các lỗi Swift khác với các ngoại lệ Objective-C. Cú pháp tương tự, nhưng mục đích khác nhau. –

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