Получение списка файлов в каталоге с глобусом
По какой-то сумасшедшей причине я не могу найти способ получить список файлов с глобусом для данного каталога.
Я в настоящее время застрял в чем-то вроде:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot];
.. и затем вырезать вещи, которые я не хочу, что отстой. Но мне бы очень хотелось, чтобы вы могли искать что-то вроде «foo * .jpg» вместо запроса всего каталога, но я не смог найти ничего подобного.
- Добавление неизвестного количества строк в «Статические ячейки» UITableView
- Зачем использовать протокол NSObject для реализации протокола
- Как включить и использовать новые шрифты в iPhone SDK?
- Как использовать VideoToolbox для распаковки видеоstreamа H.264
- Представление controllerа модального вида сразу после отклонения другого
Итак, как ты это делаешь?
- Пользовательский интерфейс UINavigationBar
- Как я могу нажать кнопку за прозрачным UIView?
- Как я могу программно проверить, присутствует ли клавиатура в приложении iOS?
- Множественное перечисление значений в Obj-C
- Как добавить 1 день к NSDate?
- Интеграция CFNetwork и Bonjour для интеграции iPhone и Mac
- UIWebView - Как определить последнее сообщение webViewDidFinishLoad?
- Заголовок Swift для Objective-C, не созданный в Xcode 6
Вы можете добиться этого довольно легко с помощью NSPredicate, например:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; NSFileManager *fm = [NSFileManager defaultManager]; NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil]; NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]; NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr];
Если вам нужно сделать это с помощью NSURL, это будет выглядеть так:
NSURL *bundleRoot = [[NSBundle mainBundle] bundleURL]; NSArray * dirContents = [fm contentsOfDirectoryAtURL:bundleRoot includingPropertiesForKeys:@[] options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]; NSPredicate * fltr = [NSPredicate predicateWithFormat:@"pathExtension='jpg'"]; NSArray * onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr];
Это хорошо работает для IOS
, но также должно работать на cocoa
.
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; NSFileManager *manager = [NSFileManager defaultManager]; NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot]; NSString *filename; while ((filename = [direnum nextObject] )) { //change the suffix to what you are looking for if ([filename hasSuffix:@".data"]) { // Do work here NSLog(@"Files in resource folder: %@", filename); } }
Как насчет использования методов hasSuffix и hasPrefix NSString? Что-то вроде (если вы ищете «foo * .jpg»):
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot]; for (NSString *tString in dirContents) { if ([tString hasPrefix:@"foo"] && [tString hasSuffix:@".jpg"]) { // do stuff } }
Для простых, простых совпадений это было бы проще, чем использование библиотеки регулярных выражений.
Очень простой метод:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSFileManager *manager = [NSFileManager defaultManager]; NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; //--- Listing file by name sort NSLog(@"\n File list %@",fileList); //---- Sorting files by extension NSArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF EndsWith '.png'"]; filePathsArray = [filePathsArray filteredArrayUsingPredicate:predicate]; NSLog(@"\n\n Sorted files by extension %@",filePathsArray);
В Unix есть библиотека, которая может выполнять операции с файлами. Функции и типы объявляются в заголовке glob.h
, поэтому вам нужно будет #include
его. Если открыть терминал, откройте страницу man glob, набрав man 3 glob
вы получите всю информацию, которую вам нужно знать, чтобы использовать функции.
Ниже приведен пример того, как вы можете заполнить массив файлами, которые соответствуют шаблону globbing. При использовании функции glob
есть несколько вещей, которые вам нужно иметь в виду.
- По умолчанию функция
glob
ищет файлы в текущем рабочем каталоге. Чтобы искать другой каталог, вам нужно добавить имя каталога к шаблону globbing, как я сделал в моем примере, чтобы получить все файлы в/bin
. - Вы отвечаете за очистку памяти, выделенной
glob
, вызываяglobfree
когда вы закончите со структурой.
В моем примере я использую параметры по умолчанию и не обратный вызов ошибки. Страница руководства охватывает все варианты в случае, если вы хотите что-то использовать. Если вы собираетесь использовать вышеуказанный код, я бы предложил добавить его как категорию в NSArray
или что-то в этом роде.
NSMutableArray* files = [NSMutableArray array]; glob_t gt; char* pattern = "/bin/*"; if (glob(pattern, 0, NULL, >) == 0) { int i; for (i=0; i
Изменить: я создал gistub, содержащий вышеуказанный код в категории NSArray + Globbing .
Вам нужно свернуть свой собственный метод, чтобы исключить файлы, которые вам не нужны.
Это непросто со встроенными инструментами, но вы можете использовать RegExKit Lite, чтобы помочь найти элементы в возвращаемом массиве, который вас интересует. Согласно примечаниям к выпуску, это должно работать как в приложениях Cocoa, так и в Cocoa-Touch.
Вот демо-код, который я написал примерно через 10 минут. Я изменил <и> на “, потому что они не отображались внутри предварительного блока, но он по-прежнему работает с кавычками. Может быть, кто-то, кто знает больше о форматировании кода здесь, в StackOverflow, исправит это (Chris?).
Это шаблонный проект «Утилита командной строки». Если я получу своего демона git и запущусь на своем домашнем сервере, я отредактирую этот пост, чтобы добавить URL-адрес проекта.
#import "Foundation / Foundation.h" #import "RegexKit / RegexKit.h" @interface MTFileMatcher: NSObject { } - (void) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath; @конец int main (int argc, const char * argv []) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // вставляем код здесь ... MTFileMatcher * matcher = [[[MTFileMatcher alloc] init] autorelease]; [matcher getFilesMatchingRegEx: @ "^. + \\. [Jj] [Pp] [Ee]? [Gg] $" forPath: [@ "~ / Pictures" stringByExpandingTildeInPath]]; [уборка бассейна]; return 0; } @implementation MTFileMatcher - (void) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath; { NSArray * filesAtPath = [[[NSFileManager defaultManager] directoryContentsAtPath: inPath] arrayByMatchingObjectsWithRegex: inRegex]; NSEnumerator * itr = [filesAtPath objectEnumerator]; NSString * obj; while (obj = [itr nextObject]) { NSLog (OBJ); } } @конец
Я не буду притворяться экспертом по этой теме, но у вас должен быть доступ к функции glob
и wordexp
из объекта-c, нет?
stringWithFileSystemRepresentation, похоже, недоступна в iOS.