74

Snow Leopard では、パス名やコア サービスの FSRef ではなく、NSURL オブジェクトを使用してファイルを参照する新しい方法が多数導入されました。

ただし、URL ベースの方法が見つからないタスクが 1 つあります。それは、ファイルが存在するかどうかをテストすることです。-[NSFileManager fileExistsAtPath:]の URL ベースのバージョンを探しています。そのメソッドと同様にYES、通常のファイル、ディレクトリ、またはその他のいずれであっても、URL が何かを記述している場合に返されます。

さまざまなリソース値を調べようとすることもできますが、ファイルが存在しない場合に存在しないことが明示的に保証されているものはありません。

NSFileManager の を使用することもできますfileExistsAtPath:が、より現代的な方法があれば、それを使用したいと思います。

Cocoa、CF、またはコア サービスに、特定のファイル (またはファイル参照) URL が存在するファイル システム オブジェクトを参照しているかどうかを教えてくれることが保証/文書化されている単純なメソッドまたは関数はありますか?

4

6 に答える 6

143

NSURL には次のメソッドがあります。

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

「ファイル URL が指すリソースに到達できるかどうかを返します。」

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
               isDirectory:NO];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    [[NSAlert alertWithError:err] runModal];
于 2009-12-18T16:16:03.080 に答える
30

iOSでは他の方法を見つけることができませんでした...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
于 2011-01-20T10:38:32.140 に答える
10

Swift 2の答えは次のとおりです。

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
于 2016-01-28T20:11:27.423 に答える
2

特定のファイル (またはファイル参照) URL が存在するファイル システム オブジェクトを参照しているかどうかを判断することは、リモート リソースにとって本質的にコストがかかります。この CFURLResourceIsReachable() および [NSURL checkResourceIsReachableAndReturnError:] の 10.6 のみの API (iPhoneOS なし) は両方とも同期的です。 、それらを使用していたとしても、多くのファイルの場合、依然としてかなりの遅延オーバーヘッドが見られます。

すべきことは、有効なリソースのリストを個別に作成するキャッシュを使用して、独自の非同期チェック ルーチンを実装することです。

それ以外の場合、ヘッダー状態の CFURLResourceIsReachable のメモ:

例としては、特定のドキュメントの存在に依存する UI 状態の定期的なメンテナンスがあります。ファイルを開くなどの操作を実行する場合、最初に到達可能性を確認するよりも、単に操作を試行して失敗を処理する方が効率的です。

于 2010-04-24T11:53:06.163 に答える
1

NSURL はそれ以上のローカル ファイル システムを表すことができるため、信頼できる方法でそれらの存在をテストできる一般的な方法はないと思います。少なくとも、Cocoa Foundation にはそのような機能は含まれていません (私の知る限り)。

ローカル ファイル システムのみを扱う場合は、メッセージ付きのNSURLまたはのカテゴリを作成することをお勧めします。を (正規化されたパス)に変換してから、メッセージを呼び出します。NSFileManagerurlExists:NSURLNSString[NSFileManager fileExistsAtPath:]

于 2009-12-18T12:06:35.190 に答える