NSFileManager 错误?

Posted

技术标签:

【中文标题】NSFileManager 错误?【英文标题】:NSFileManager Bug? 【发布时间】:2011-08-12 07:30:58 【问题描述】:

你能在这行代码中找到一个错误吗?它返回零! 该应用已完全沙盒化,但已启用下载文件夹访问权限。

NSArray*array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"/Downloads/"] error:NULL];
        //array==nil: Why?

[编辑] 问题:我无法测试它。它发生在审查机器的来宾帐户上。编译的二进制文件是否有问题,或者您有任何解决此问题的提示吗?

【问题讨论】:

您是否能够写入文件并在审核团队运行后获取该文件?您可以使用 [NSString writeToFile:atomically:encoding:error:] 消息。我相应地在下面编辑了我的帖子 NSHomeDirectory()返回的值是多少? @Wizz 我实现了一个方法,该方法返回有关应用程序的一些信息(在 Wizz 回答错误之后)并将其写入文件。现在我正在等待答案(发布在解决中心)。收到回复后会再写评论。 @Richard NSHomeDirectory() 在评论机器上返回“/Users/Guest”。 (完整路径:“/Users/Guest/Downloads”)。你能从中读出些什么吗? @Richard 现在这很有趣。该方法在沙盒化时不会返回错误,而是返回完全错误的路径。在他们的机器上它返回:/Users/Guest/Library/Containers/[Bundle ID of App]/Data/Downloads 你能告诉我如何得到正确的,也许没有硬编码? 【参考方案1】:

尝试读取带有错误句柄的目录以检查会发生什么:

NSError *error = nil;
NSArray*array = [[NSFileManager defaultManager] 
                  contentsOfDirectoryAtPath:
                   [NSHomeDirectory() stringByAppendingPathComponent:@"/Downloads/"] 
                                      error:&error];
if ( !array ) 
     NSLog(@"ERROR: %@", [error description]);

这将为您提供更详细的说明出了什么问题。

要将此错误记录到文件 quick'n'dirty,请使用以下消息:

[[error description] writeToFile:@"strangeerrors.log" 
  atomically:NO encoding:NSUTF8StringEncoding error:nil];

【讨论】:

谢谢,但遗憾的是我无法记录此内容。问题是我的机器上没有发生这种情况。它发生在审查小组的一台机器上。你能给我一些建议吗?我还编辑了我的问题.. 你现在无能为力。如果您的代码忽略了系统提供的成功/失败和任何错误,那么这是您做出的有意识的选择,这就是后果。您的代码已损坏,因为它不会从可能失败的指令中报告容易获得的系统级错误。按照 Wizz 的建议修复您的代码(完成日志记录),发布更新,然后如果问题再次发生,请发送用户说明以向您发送其控制台日志的副本。【参考方案2】:

您是否尝试过替换

[NSHomeDirectory() stringByAppendingPathComponent:@"/Downloads/"]

[@"~/Downloads" stringByExpandingTildeInPath]

?

【讨论】:

感谢您的帮助。可悲的是,我不知道这是问题所在还是 OfDirectoryAtPath:error: 方法的内容。所以我必须问我问过迈克的同样的问题。我应该尝试您的示例(我必须重新提交它),是否可以/正确解析沙箱中的符号链接,我应该尝试另一个目录枚举还是应该简单地联系 Apple DTS?或者您知道为什么该应用在我的 Mac 上的行为有所不同吗?【参考方案3】:

在附加路径组件时不需要添加任何斜线。很简单:

[NSHomeDirectory() stringByAppendingPathComponent:@"Downloads"] ...

对我来说很好用!

【讨论】:

【参考方案4】:

几乎可以肯定这不是真正的问题,但可以说将@"Downloads/" 作为路径组件而不是前导斜杠更有意义。在 Cocoa 看来,求 @"/Downloads/" 的组件会给你:

@"/"
@"Downloads"

这可能不是你想要的。

【讨论】:

感谢您的回答。你认为你的例子会有什么不同吗?我已经通过 [NSSearchForDirectoriesInDomains(NSDownloadDirectory,NSUserDomainMask,YES) objectAtIndex:0] 尝试了它并解析了符号链接,因为文档说它“不遍历符号链接”,但这也失败了。我应该尝试您的示例(我必须重新提交它),是否可以/正确解析沙箱中的符号链接,我应该尝试另一个目录枚举还是应该简单地联系 Apple DTS?或者您知道为什么该应用在我的 Mac 上的行为有所不同吗?

以上是关于NSFileManager 错误?的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager 中的错误(实例方法是遍历符号链接)

使用 NSFileManager 检索多个值时收到“致命错误:在展开可选值时意外发现 nil”

为啥 NSFileManager 不工作?

我们如何关闭 NSFileManager?

使用 NSFilemanager 存储 NSMutableArray 时崩溃

如何使用 NSFileManager 复制 UNIX 可执行文件?