web-dev-qa-db-ja.com

ファイルがパスではなくURLに存在するかどうかを確認します

事前に入力されたデフォルトストアをiPhone Simulatorに設定するために、ファイルが(パスではなく)URLに存在するかどうかを確認するにはどうすればよいですか。

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
/*
 Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Food" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

テンプレートの最近のバージョンでは、applicationDocumentsDirectoryメソッドがURLを返すことを読んだため、NSURLオブジェクトを使用してファイルパスを表すようにコードを変更しました。しかし、[fileManager fileExistsAtPath:storePath]fileExistsAtPathfileExistsAtURLのようなものに変更する必要があります(明らかに存在しません)。

NSFileManager Class Referenceを確認しましたが、目的に合った適切なタスクが見つかりませんでした。

ヒントはありますか?

60
Pedro Sousa
if (![fileManager fileExistsAtPath:[storeURL path]]) 
...

ドキュメント から:

このURLオブジェクトにファイルURL(isFileURLで決定)が含まれている場合、このメソッドの戻り値は、NSFileManagerまたはNSPathUtilitiesのメソッドへの入力に適しています。パスの末尾にスラッシュがある場合は、削除されます。

119
Mundi

ファイルシステムURLの場合、NSURL自体に、URLの到達可能性をチェックするメソッドがあります

NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
  // do something
} else {
  NSLog(@"%@", error);
}
15
vadian
if (![fileManager fileExistsAtPath:[storeURL path]]) 

大丈夫ですが、気をつけてください:のようなURLの場合:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

[storeURL path]はそのパスを提供します([storeURL lastPathComponent]に適用されます:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e

しかし、/var/mobile/Applications/DB92F4DC-49E4-4B4A-8271-6A9DAE6963BC/Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50などの文字列でlastPathComponentを使用すると、1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50が得られます

URLに「?」があるので、それは良いことです。はGETパラメータに使用されますが、文字列と混ぜると問題が発生する可能性があります。

4
Mickaël