当我尝试遵循别名时,枚举目录会给我一个错误

时间:2012-05-18 16:11:12

标签: cocoa nsfilemanager

我希望我的用户能够将文件夹放入我的OSX应用程序中。然后我查看目录及其子目录中的所有文件。这工作正常,但在目录中有别名时则不行。别名被正确解析(感谢Matt Gallagher,对你的Apple感到羞耻)但是枚举器不允许我枚举目标目录(它只返回没有元素和下面的错误)。以下是一些示例代码:

-(void)enumDirAtPath:(NSString*)path  {
    NSString* file_enum = nil;
    NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
    while (file_enum = [enumerator nextObject])
    {
        NSString* file =  [[NSString stringWithFormat:@"%@/%@",path,file_enum] stringByResolvingSymlinksAndAliases];

        BOOL isDirectory = NO;
        [[NSFileManager defaultManager] fileExistsAtPath:file isDirectory: &isDirectory];
        if (!isDirectory) {
            NSLog(@"Adding file: %@",file);
        } else {
            NSLog(@"Found dir: %@",file);
           [self enumDirAtPath: file];
        }
   }
}

enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:相同的代码给了我这个错误:

  

错误:错误Domain = NSCocoaErrorDomain Code = 257“文件”Musik“   因为你没有权限查看它而无法打开。“   的UserInfo = 0x1094cf670   {NSURL =文件://本地主机/用户/大卫/桌面/ MUSIK,   NSFilePath = / Users / david / Desktop / Musik,NSUnderlyingError = 0x1094d43f0   “操作无法完成。操作不允许”}

即使我只是dispatch_async递归调用它也不会让我这样做。有什么方法可以迭代一个目录并获取所有内容吗?

注意:我完全清楚这会导致无限循环。这段代码只是为了说明问题。

1 个答案:

答案 0 :(得分:0)

我非常确定答案就在错误信息中:

  

由于您无权查看“Musik”文件,因此无法打开该文件。

在Finder应用程序中显示别名的目的地并通过“获取信息”或终端中的ls -l@检查其权限 - 我敢打赌您的用户帐户david未被授予一个以下权限:

  • read
  • execute
  • list

最后一个通常在命令行中可见,除非与显式deny - access-control-entry结合使用。