问题 NSSearchPathForDirectoriesInDomains返回错误的目录


我在用着 NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 在我的应用程序中获取应用程序文档目录,但返回的数组只包含一个对象,这是一个不可写的,不正确的目录:

/ Users / me / Library / Application Support / iPhone Simulator / Documents

我发现 这个问题 这表明问题与供应有关,但答案只是说明了。所以我想我问的是一个重复的问题,但这个问题的答案是不够的,所以我希望能在这个问题上得到一个真正的答案。


4587
2018-06-29 05:06


起源

这个问题的答案确实非常令人不满意。当你在这里找到解决方案时,请标记一个mod来合并/关闭另一个。 - Josh Caswell
控制台是否显示任何错误? - Oscar Gomez
其他一些答案/评论似乎表明这个函数实际上可能正在返回一个数组 超过一个 目录。你能检查看看是不是吗? - jtbandes
嗯...所以返回目录的原因可能与您对应用程序的期望可能与Xcode目标类型有关。这不会成为测试目标吗?在这种情况下,正确的答案很可能是没有应用程序GUID的答案,因为实际上它不是一个应用程序。谷歌小组讨论意味着,如果是这种情况,您只需创建目录即可: groups.google.com/group/google-toolbox-for-mac/browse_thread/... - Rob
只是为了笑容,我从终端窗口创建了目录/ Users / me / Library / Application Support / iPhone Simulator / Documents,现在它似乎正在运行。仍有测试错误,但这些可能是真实的。 - Rob


答案:


嗯...所以返回目录的原因可能与您对应用程序的期望可能与Xcode目标类型有关。这不会成为测试目标吗?在这种情况下,正确的答案很可能是没有应用程序GUID的答案,因为实际上它不是一个应用程序。这个 谷歌小组讨论 暗示如果是这种情况,你只需创建目录即可。

只是为了笑容,我从终端窗口创建了目录/ Users / me / Library / Application Support / iPhone Simulator / Documents,现在它似乎正在运行。仍有测试错误,但这些可能是真实的。

我建议您更改测试应用程序以创建文档目录(如果它丢失) - 例如:

  if(![[NSFileManager defaultManager] createDirectoryAtPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) withIntermediateDirectories:YES attributes:nil error:NULL])
        NSLog(@"Error: Create folder failed %@", NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES));

7
2017-07-06 12:38





这对我有用:

[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                        inDomains:NSUserDomainMask] lastObject];

2
2018-06-29 05:37



感谢你的回答。不幸的是,URLForDirectory:inDomains:仅在iOS 4.0及更高版本中可用,我支持3.1.3。有没有其他方法可以找到4.0之前可用的目录? - Josh Brown
我没有给你答案,但你为什么还支持3.x?没有必要为<5%的用户而失去生产力。 - vocaro
我试过这种方法,但遇到了同样的问题。它给了我与NSSearchPathForDirectoriesInDomains完全相同的目录。 - Josh Brown


你可以试试这个:

 /**
 Returns the path to the application's Documents directory.
 */
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

我相信你只是缺少lastObject消息。


1
2017-07-05 01:49



谢谢。事实上,这就是我正在做的事情 - 从lastObject返回的NSString是问题中指定的错误路径。 - Josh Brown
@Josh Brown消息是否返回数组中的多个项目?,您是否尝试过写入任何返回路径? - Oscar Gomez
@Josh Brown问题也可能与msg stringByAppendingPathComponent有关:如果你没有传递一个有效的文件名。 - Oscar Gomez


我有完全相同的问题,在我的情况下,这是因为我正在运行XCTest类的代码。

我的猜测是测试不在应用程序沙箱中运行。

那是因为我的测试与主项目中包含的静态库项目有关。

只要从我的应用程序运行中运行完全相同的代码,就会正确返回路径。

希望这可以帮助。


0
2018-01-28 08:55