Игнорируйте файлы .DS_Store и Icon в папке с какао NSFIleManager - PullRequest
14 голосов
/ 02 мая 2011

Я пытаюсь удалить определенные файлы из каталога с помощью NSFileManager. Я хотел бы игнорировать скрытые файлы .DS_Store и Icon (в папке, которую я проверяю, должен быть пользовательский значок), которые находятся в каталоге, однако я также продолжаю случайно их удалять. Прямо сейчас я делаю следующее:

 NSFileManager *manager = [NSFileManager defaultManager];
 NSArray *dirContents = [manager contentsOfDirectoryAtPath:[selectedFolder stringValue] error:nil]; 
 for (int i = 0; i < [dirContents count]; i++)
 {
     NSString *theFile = [dirContents objectAtIndex:i];

     if([theFile isEqualToString:@".DS_Store"] || [theFile isEqualToString:@"Icon?"] || [theFile isEqualToString:@"Icon"])
     { 
        continue;
     }
     //do manipulations on files here
 }
[manager release];

Однако файлы .DS_Store и Icon не совпадают в моем операторе if. Кроме того, когда я показываю скрытые файлы в Finder, файл значка называется «Значок». Однако выполнение команды ls в этом каталоге в терминале выводит «Icon?».

Как правильно разобрать эти файлы в моем коде?

Спасибо

EDIT: Таким образом, он на самом деле успешно игнорирует файл .DS_Store, но файл Icon по-прежнему игнорирует оператор if.

Ответы [ 3 ]

25 голосов
/ 02 мая 2011

Интересно, я считаю, что вопрос часть другого вопроса, опубликованного недавно , по сути, отвечает на ваш.Если вы используете:

-[NSFileManager contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:] 

( ссылка на документ ), вы можете передать опцию NSDirectoryEnumerationSkipsHiddenFiles, чтобы игнорировать скрытые файлы, чтобы вам не приходилось проверять конкретные файлы.:

NSURL * selectedFolderURL = [NSURL fileURLWithPath:[selectedFolder stringValue]];
[myFileManager contentsOfDirectoryAtURL:selectedFolderURL
             includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey]
                                options:NSDirectoryEnumerationSkipsHiddenFiles
                                  error:&error];

Обратите внимание, что это возвращает абсолютные URL-адреса, тогда как метод в вашем вопросе возвращает пути относительно в исходный каталог.Легко работает, но важно знать, особенно если вы удаляете что-либо.

3 голосов
/ 02 мая 2011

Имя файла пользовательского ресурса значка папки "Icon\r" (Icon, за которым следует возврат каретки).

Что я обычно делаю при перечислении директории, в которой я хочу пропустить невидимые элементы (те, чье имя начинается с "."), Это проверка префикса @ ".":

NSMutableArray *fullPaths = [NSMutableArray array];

NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];

NSArray *subpaths = [fileManager subpathsAtPath:filePath];

for (NSString *subpath in subpaths) {
   if ( ![[subpath lastPathComponent] hasPrefix:@"."] && 
        ![[subpath lastPathComponent] isEqualToString:@"Icon\r"]) {
        [fullPaths addObject:[filePath stringByAppendingPathComponent:subpath]];
   }
}
// continue

Приведенный выше код будет работать в 10.5 и более поздних версиях (или даже в 10.0, я полагаю, если вы изменили быстрое перечисление для использования NSEnumerator).

P.S. Если вы создаете NSFileManager с использованием +defaultManager, вам не следует использовать строку [manager release], так как это может привести к перевыпуску.

Итак, вместо:

NSFileManager *manager = [NSFileManager defaultManager];
// 
[manager release];

сделать

NSFileManager *manager = [[NSFileManager alloc] init];
//
[manager release];

или

NSFileManager *manager = [NSFileManager defaultManager];
//
0 голосов
/ 19 ноября 2013

Простой метод:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *imageFilenames = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];

for (int i = 0; i < [imageFilenames count]; i++)
    {

    NSString *imageName = [NSString stringWithFormat:@"%@/%@",documentsDirectory,[imageFilenames objectAtIndex:i] ];

        if (![[imageFilenames objectAtIndex:i]isEqualToString:@".DS_Store"])
        {
          UIImage *myimage = [UIImage imageWithContentsOfFile:imageName];
          UIImageView *imageView = [[UIImageView alloc] initWithImage:_myimage];
        }
    }
...