NSFileManager -createFileAtPath 失败并出现 NSInvalidArgumentException
Posted
技术标签:
【中文标题】NSFileManager -createFileAtPath 失败并出现 NSInvalidArgumentException【英文标题】:NSFileManager -createFileAtPath fails with NSInvalidArgumentException 【发布时间】:2014-09-23 17:28:19 【问题描述】:也许我只是错过了文档中的某些内容,但我找不到任何说明这种行为应该在 ios 8 中改变的内容。
我的应用程序将当前工作目录设置为Documents
目录,然后尝试使用NSFileManager -createFileAtPath
在其中创建一个文件。在 iOS 8 之前,这可以正常工作。在运行 iOS 8 的设备上,我在致电 -createFileAtPath:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSFileManager fileSystemRepresentationWithPath:]: nil or empty path argument'
这是重现问题的最小代码 sn-p:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:docsDir];
[[NSFileManager defaultManager] createFileAtPath:@"temp.dat" contents:nil attributes:nil];
注意createFileAtPath
上的路径参数是"temp.dat"
- 如果我将其更改为"./temp.dat"
,则调用成功。
我是否在做一些愚蠢的事情,而这只是“意外”在以前的 iOS 版本中工作?还是他们故意改变这里的行为?还是这是 iOS 8 中的错误?其他采用 path
参数的 NSFileManager 方法似乎可以只使用文件名(例如 -removeItemAtPath:@"temp.dat" error:&err
成功)。
编辑添加:
这只发生在物理设备上。在模拟器中,上面对createFileAtPath
的调用成功了。
【问题讨论】:
createFileAtPath
应该传递一个完整的路径名。将temp.dat
附加到docsDir
并传入。无需更改当前目录。
@rmaddy:我想我的意思是它适用于 iOS 8 之前的所有版本(这是一个自 iOS 3 以来就存在的应用程序),我在文档中找不到任何东西表明它应该改变了。 “temp.dat”是一个相对路径(与“./temp.dat”相同) - 文档没有指定它必须是绝对路径,并且其他 NSFileManager 方法接受相同的相对路径(带或不带 . /) 正好。我倾向于将其称为错误(在操作系统或文档中)并向 Apple 发送错误报告。
iOS8 发行说明中有一个简短的提及,说“应用容器的文件系统布局在磁盘上发生了变化。与其依赖硬编码的目录结构,不如使用 NSSearchPathForDirectoriesInDomains 函数或 URLForDirectory :inDomain:appropriateForURL:create:error: NSFileManager 类的方法。”。但是,这并不能解释您的错误...
那么,您确定 docsDir 是否有效?
@HotLicks:是的,docsDir 是有效的。另请注意,创建“./temp.dat”成功,而“temp.dat”失败。如果 docsDir 无效,或者 changeCurrentDirectoryPath 失败,则不会出现这种情况。
【参考方案1】:
我打开了 Apple 的一个错误,他们将其作为副本关闭。虽然这并不一定证实他们认为这是一个错误,但它至少证实了我不是第一个遇到这个问题的人,而且这种行为确实在 iOS 8 中发生了变化。
目前,解决方案是将./
添加到文件名之前,或提供绝对路径。
【讨论】:
你在开玩笑吧。我的 App Store 应用程序已经运行了 6 个月,现在开始崩溃。苹果的警告在哪里???以上是关于NSFileManager -createFileAtPath 失败并出现 NSInvalidArgumentException的主要内容,如果未能解决你的问题,请参考以下文章