Получить путь к файлу по имени файла из каталога документов ios

В моем приложении я загружаю файлы PDF, которые хранятся в каталоге "Документ" в разных подпапках.

Теперь у меня есть имя файла, для которого я хочу получить его путь в каталоге "Документ", но проблема в том, что я не знаю точной подпапки, в которой хранится этот файл.

Итак, есть ли какой-либо метод, который даст мне путь к файлу по имени файла, например, существует один метод, который работает для основного пакета:

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

Я не хочу проходить через каждую папку, которая является утомительным способом.

Спасибо.

Ответы

Ответ 1

Вы можете выполнить поиск в каталоге документов следующим образом:

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);
}

EDIT:

Вы также можете использовать 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);

Ответ 2

Swift 2.2 довольно простой:

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

Ответ 3

Вам нужно будет идти по дереву, чтобы найти файл; нет эквивалента -pathForResource: ofType, который работает в каталоге ~/Documents.