使用Cocoa NSFIleManager忽略文件夹中的.DS_Store和Icon文件

时间:2011-05-01 20:25:15

标签: objective-c cocoa parsing icons 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];

但是,我的if语句中没有匹配.DS_Store和Icon文件。此外,当我在Finder中显示隐藏文件时,图标文件称为“图标”。但是,在终端的该目录中执行ls打印出“Icon?”。

如何在我的代码中正确解析这些文件?

由于

修改 所以它实际上是成功忽略.DS_Store文件,但Icon文件仍然超过了if语句。

3 个答案:

答案 0 :(得分:24)

有趣的是,我相信another question posted recently问题部分基本上可以回答你的问题。如果您使用:

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

请注意,这会返回绝对网址,而您问题中的方法会将 relative 的路径返回到原始目录。很容易解决,但重要的是要知道,如果你删除的东西。

答案 1 :(得分:3)

文件夹的自定义图标资源的文件名为“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];

DO

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

NSFileManager *manager = [NSFileManager defaultManager];
//

答案 2 :(得分:-1)

简单方法:

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