Игнорировать файлы .DS_Store и Icon в папке с Cocoa NSFIleManager

Я пытаюсь удалить определенные файлы из каталога с помощью 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, но файл значка по-прежнему выходит за оператор if.

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

Имя ресурса пользовательских значков папки "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];
//

Ответ 3

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

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