2009-12-18 100 views
68

Snow Leopard引入了許多使用NSURL對象來引用文件的新方法,而不是路徑名或Core Services的FSRefs。使用NSURL測試文件存在

但是,有一項任務我無法找到基於URL的方法:測試文件是否存在。我正在尋找一個基於URL的版本-[NSFileManager fileExistsAtPath:]。像這種方法一樣,如果URL描述了任何東西,無論是普通文件,目錄還是其他東西,它都應該返回YES

我可以嘗試查找各種​​resource values,但是如果文件不存在,它們中的任何一個都不會明確保證不存在,並且如果它們中的一些(例如,NSURLEffectiveIconKey)可能是昂貴的。

我可以使用NSFileManager的fileExistsAtPath:,但如果有更現代的方法,我寧願使用它。

Cocoa,CF或Core Services中是否存在一個簡單的方法或函數,它可以保證/記錄下來告訴我給定文件(或文件引用)URL是否指向存在的文件系統對象?

回答

130

NSURL的確有這種方法:「返回是否通過資源文件URL指向可以達到」

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

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

任何iPhone操作系統的開發者都會被這​​個答案拋出:'checkResourceIsReachableAndReturnError:'僅在10.6及更高版本中可用,並且尚未在iPhone SDK中提供。 – 2010-03-14 15:18:24

+4

更新:從iOS 4開始可用。 – 2010-08-05 20:30:04

+2

XCode 3.2.5(支持iOS 4.2)中的iOS文檔聲明:「此方法在iOS中未實現,因此它不執行任何操作。」 – Daniel 2011-01-18 21:07:37

1

由於NSURL可以代表更多的本地文件系統,我不認爲有一種通用的方法可以以可靠的方式測試它們的存在。至少,可可基金會不包含這樣的功能(據我所知)。

如果您只處理本地文件系統,我建議您爲NSURLNSFileManager創建一個類別,並附上urlExists:消息。它會將NSURL轉換爲NSString(標準化路徑),然後調用[NSFileManager fileExistsAtPath:]消息。

+0

你可以將前面提到的'checkResourceIsReachableAndReturn錯誤:'用'isFileURL'來保持它的正常。 – 2011-11-23 02:49:55

2

確定是否URL是指存在的文件系統對象的給定文件(或文件引用)是用於遠程資源固有昂貴,10.6(不使用的iPhoneOS)API的本CFURLResourceIsReachable()和[ NSURL checkResourceIsReachableAndReturnError:]都是同步的,即使你會使用它們,對於很多文件你仍然會看到顯着的延遲開銷。

你應該做的是用緩存實現你自己的異步檢查例程,分別創建一個有效資源列表。

否則在頭狀態的筆記CFURLResourceIsReachable:

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

我懷疑它很慢... NSURL保持一個鏈接到它所代表的HFS +文件系統條目。根據Apple的說法,URL比所有文件系統操作的路徑快得多。 – 2014-03-28 22:41:08

29

在iOS上我找不到任何其他方式...

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

這裏是斯威夫特2答案:

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

它應該是'checkResourceIsReachable() - > Void'並拋出異常,但是,你說的是正確的Xcode 7.x – 2016-05-30 09:35:34

+0

*拋出錯誤。 Swift錯誤與Objective-C異常不同。類似的語法,但目的不同。 – 2016-06-10 05:48:35