2011-06-29 69 views
11

我使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)让我的应用程序的申请文件目录,但所返回数组只包含一个对象,这是一个不可写的,不正确的目录:NSSearchPathForDirectoriesInDomains返回错误的目录

/用户/我/图书馆/应用程序支持/ iPhone模拟器/文档

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

+1

对这个问题的回答的确非常不满意。当你在这里找到解决方案时,请标记一个mod来合并/关闭另一个。 –

+0

控制台是否显示任何错误? –

+0

其他一些答案/评论似乎表明这个函数实际上可能会返回一个包含*多于一个*目录的数组。你可以检查一下,看看是不是? – jtbandes

回答

7

嗯...所以返回的目录可能会有所不同,以至于您对应用程序的期望可能与Xcode目标类型有关。这不会成为测试目标吗?在这种情况下,正确的答案很可能是没有应用程序GUID的答案,因为实际上它不是应用程序。这个google group discussion意味着如果是这样的话,你只需简单地创建目录即可。

只是为了咧嘴笑,我从终端窗口创建了目录/用户/我/图书馆/应用程序支持/ iPhone模拟器/文档,现在它似乎运行。仍然存在测试错误,但这些错误可能是真实的。

我建议你改变你的测试应用程序创建的文件目录,如果它是缺失的 - 是这样的:

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

这个工作对我来说:

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

感谢您的回答。不幸的是,URLsForDirectory:inDomains:仅适用于iOS 4.0及更高版本,我支持3.1.3。有另一种方法可以找到4.0以前的这个目录吗? –

+1

我没有你的答案,但为什么你仍然支持3.x? <5%的用户不会失去生产力。 – vocaro

+0

我试过这种方法,但有同样的问题。它给了我与NSSearchPathForDirectoriesInDomains完全相同的目录。 –

1

你可以试试这个:

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

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

+0

谢谢。事实上,这就是我正在做的事 - 从lastObject返回的NSString是在问题中指定的不正确的路径。 –

+0

@Josh Brown消息是否返回数组中的多个项目?是否尝试写入任何返回路径? –

+0

@Josh Brown这个问题也可能与msg stringByAppendingPathComponent有关:如果你没有传递一个有效的文件名。 –

0

我有完全相同的问题,在我的情况,那是因为我m从XCTest类运行代码。

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

这是因为我的测试与静态库项目相关,包括在主项目中。

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

希望这会有所帮助。