NSURLを使用してファイルの存在をテストします
-
20-09-2019 - |
質問
Snow Leopardには、ファイルではなく、パス名またはコアサービスFSRefsを参照するNSURLオブジェクトを使用するために多くの新しい方法を紹介します。
ファイルが存在するかどうかのテスト:しかし、私はURLベースの方法を見つけることができない一つのタスクがあります。私は<のhref = "http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//のURLベースのバージョンを探していますapple_ref / OCC / instm / NSFileManager / fileExistsAtPath:」REL = "noreferrer"> - [NSFileManager fileExistsAtPath:
] の。 URLが何かを記述する場合、そのメソッドと同じように、それは通常のファイル、ディレクトリ、または何か他のかどうか、YES
を返す必要があります。
私は様々なを検索しようとする可能性があり、<のhref = "http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref / OCC / instm / NSURL / resourceValuesForKeys:エラー:」のrel = 『noreferrer』>リソース値を、それらのどれもが明示的にファイルが存在しない場合ではないことが保証されていない、と彼ら(の一部例えば、< href = "http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSURLEffectiveIconKey" のrel = "noreferrerそれがない場合は「> NSURLEffectiveIconKey の)コストがかかる可能性があります。
私はちょうどNSFileManagerのfileExistsAtPath:
を使用することができますが、より近代的な方法があるのならば、私はそれを使用することを好むと思います。
指定したファイル(またはファイル参照)URLは?
が存在するファイル・システム・オブジェクトを参照するかどうか私に教えて文書化ココア、CF、または/保証のコアサービスで簡単な方法や機能があります解決
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];
他のヒント
iOSでは、私は、他の方法を見つけることができませんでした...
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
ここでのスウィフト2 の答えがあります
var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
このCFURLResourceIsReachable()とするために、10.6のみ(なしiPhoneOS)APIを決定[NSURL checkResourceIsReachableAndReturnError:]あなたはまだ大幅な遅延のオーバーヘッドを見されるファイルの多くのために、それらを使用されるだろうしても、両方とも同期しています。
あなたが個別に有効なリソースのリストを作成し、キャッシュを使用して独自の非同期チェックルーチンを実装している何をすべきます。
ヘッダ状態でCFURLResourceIsReachableためのそれ以外の場合の注意事項:
の例では、依存UI状態の定期的なメンテナンスになります 特定の文書の存在に。実行するとき そのようなファイルを開くなどの操作、単にしようとする方が効率的です 到達可能性のために最初にチェックするよりも、失敗を操作し、ハンドルます。
、私は信頼性の高い方法で自分の存在をテストすることができ、一般的な方法はないと思います。少なくとも、ココアの基盤は(私の知る限りでは)そのような機能が含まれていません。
あなたは、ローカルのファイルシステムを扱う場合は、、私はNSURL
メッセージで、あなたはNSFileManager
またはurlExists:
のカテゴリを作成することをお勧めします。これはNSURL
(正規化された経路)にNSString
を変換し[NSFileManager fileExistsAtPath:]
メッセージを呼び出すだろう。
スウィフトでは、残念ながら(ファイルが到達可能である場合)checkResourceIsReachable()
を返すか(それが到達できない理由を説明)エラーがスローされますいずれかtrue
方法を、使用することができます。
の代わりにBOOL真/偽の値を取得するには、次の構文を使用します:
let exists = (try? inputFile.checkResourceIsReachable()) ?? false
あなたがエラーを記録したい場合:
let exists: Bool
do {
exists = try inputFile.checkResourceIsReachable()
} catch {
exists = false
print(error.localizedDescription)
}
これは高価な操作であり、それは直後に期限切れの可能性に注意してください(他のプロセスが削除またはあなたはそれが存在するかどうかをチェックしている間にディスクファイルをアンマウントされている場合)。
一般的には好ましいアプローチではなく、単にそれが失敗した場合、読み取りまたはファイルへの書き込み、その後任意のエラーを処理しようとします。
、ファイルが存在天気をチェックすることではありません