Игнорировать файлы .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];
}
}