【问题标题】:Ignore .DS_Store and Icon files in a folder with Cocoa NSFIleManager使用 Cocoa NSFIleManager 忽略文件夹中的 .DS_Store 和 Icon 文件
【发布时间】:2011-08-16 14:35:44
【问题描述】:

我正在尝试使用 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 语句。

【问题讨论】:

  • 如果您在设置theFile 之后立即写入NSLog(@"%@", theFile);,这些图标文件名是否与您在if 中测试时完全一样?
  • +1 巴伐利亚。可以肯定的是,您在终端中看到的 ? 实际上不是 ASCII ?

标签: objective-c cocoa parsing icons nsfilemanager


【解决方案1】:

有趣的是,我相信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];

请注意,这将返回绝对 URL,而您问题中的方法返回的是 相对 到原始目录的路径。很容易解决,但重要的是要知道,尤其是在您删除内容时。

【讨论】:

  • 这个方法返回的是文件的URL而不是文件的路径,所以需要对代码进行额外的修改。
  • [theURL path] 似乎有点太明显了,不得不提。
  • 我知道 ;) 无论如何,现在使用 URL 代替路径似乎是更现代的推荐方式。
  • 在我看来完全正确;基于路径的 API 在某些地方受到更多限制。
  • URL 肯定更强大。但我要说明的是,除了从 NSString 更改为 NSURL 之外,旧方法返回一个相对于目录路径的文件名数组;新的返回完整(绝对)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 及更高版本中工作,(如果您将快速枚举更改为使用 NSEnumerator,我相信甚至可以在 10.0 中使用)。

附:如果您使用+defaultManager 创建NSFileManager,则不应使用[manager release] 行,因为这会过度释放。

所以,而不是:

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

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

NSFileManager *manager = [NSFileManager defaultManager];
//

【讨论】:

  • 这对于 OP 的要求是不必要的,并且可能很危险。首先,subPathsAtPath:(其用法是not recommended after 10.4(参见“特殊注意事项”))在子目录中递归,这意味着这可能会产生不在原目录中的文件。此外,NSFileManager 将使用 NSDirectoryEnumerationSkipsHiddenFiles 跳过不可见的文件 for 您,如果您想要的话,可以使用 enumeratorAtURL:includingPropertiesForKeys:options:errorHandler: 为您提供目录内容的枚举器(尽管,NB,这也递归)。
  • 注解:并非每个隐藏文件的名称都以. 开头,例如SetFile -a V /path/to/file.
【解决方案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];
        }
    }

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 2015-10-08
    • 2011-05-08
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多