web-dev-qa-db-ja.com

ドキュメントディレクトリIOSからファイル名でファイルパスを取得する

私のアプリケーションでは、PDFファイルをダウンロードします。このファイルは、異なるサブフォルダーの下の「ドキュメント」ディレクトリに保存されます。

「ドキュメント」ディレクトリにパスを取得したいファイル名がありますが、問題はそのファイルが保存されている正確なサブフォルダがわからないことです。

だから私に与える方法はありますかファイル名によるファイルパスメインバンドルで機能する1つの方法があるように:

(NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension

面倒な方法である各フォルダを繰り返し処理する必要はありません。

ありがとう。

17
ViruMax

次のようにドキュメントディレクトリを検索できます。

NSString *searchFilename = @"hello.pdf"; // name of the PDF you are searching for

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSDirectoryEnumerator *direnum = [[NSFileManager defaultManager] enumeratorAtPath:documentsDirectory];

NSString *documentsSubpath;
while (documentsSubpath = [direnum nextObject])
{
  if (![documentsSubpath.lastPathComponent isEqual:searchFilename]) {
    continue;
  }

  NSLog(@"found %@", documentsSubpath);
}

編集:

NSPredicateも使用できます。ドキュメントディレクトリに数千のファイルがある場合、これはメモリ不足エラーでクラッシュする可能性があります。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.lastPathComponent == %@", searchFilename];
NSArray *matchingPaths = [[[NSFileManager defaultManager] subpathsAtPath:documentsDirectory] filteredArrayUsingPredicate:predicate];

NSLog(@"%@", matchingPaths);
18
Abhi Beckert

Swift 2.2はとてもシンプルです:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as NSString
let plistPath = paths.stringByAppendingPathComponent("someFile.plist")
2
FreeGor

ファイルを見つけるには、ツリーを歩く必要があります。 〜/ Documentsディレクトリで機能する-pathForResource:ofTypeに相当するものはありません。

1
Ben Gottlieb