Я попробовал ответ EmptyStack без удачи ....
Я обнаружил, что NSMetadataQuery
НЕ находит каталоги , Проблема не в том, NSPredicate
фильтрует каталоги по результатам, проблема просто в том, что запрос не находит папки. Я попробовал с отладчиком и обнаружил, что все найденные LBItem
имеют обычные файлы, а не каталоги. Я надеюсь, что Apple улучшит это в будущем.
Может быть, в MountainLion это лучше, поскольку у них, кажется, есть поддержка папок ... ой конечно, вы не читали это здесь, потому что это все еще NDA. Забудь об этом
Однако есть как минимум один способ обойти это:
Например, если у вас файловая структура;
|_Folder
| |_file
| |_file2
|_Folder1
| |_file
|_file
и мы делаем запрос с предикатом:
predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey
Результаты будут (используйте NSMetadataItemURLKey
, чтобы получить URL)
path/to/iCloud/Documents/Folder/file
path/to/iCloud/Documents/Folder/file2
path/to/iCloud/Documents/Folder1/file
path/to/iCloud/Documents/file
Что нам нужно сделать, так это отфильтровать результаты самостоятельно, посмотрев на количество компонентов каждого URL-адреса и при необходимости изменив URL-адреса. Предметы на первом уровне должны иметь numberOfComponentsOfUbiquitousContainer + 1
, на следующем уровне - еще один и так далее.
Нам также нужно отказаться от повторений (или, как в этом примере, мы получим Folder
дважды).
Возможно, не оптимально, но у меня работает,
Обновление:
Лучше использовать ниже предиката, это уменьшит результаты запросов при сканировании подпапок.
// dirPath is an NSString path of the directory you want
// to look at. Usually, for the top level directory:
// [NSFileManager URLForUbiquityContainerIdentifier:nil].path;
predicateWithFormat:@"%K BEGINSWITH %@", NSMetadataItemPathKey, dirPath];