【问题标题】:NSFileManager Bug?NSFileManager 错误?
【发布时间】: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 你能告诉我如何得到正确的,也许没有硬编码?

标签: cocoa macos sandbox nsfilemanager


【解决方案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 上的行为有所不同吗?
    猜你喜欢
    • 2016-03-31
    • 2012-11-13
    • 2014-12-10
    • 2014-07-04
    • 2019-12-28
    • 2012-05-31
    • 2011-03-27
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多