NSFileManager -createFileAtPath 失败并出现 NSInvalidArgumentException

问题描述 投票:0回答:2

也许我只是错过了文档中的某些内容,但我找不到任何说明这种行为应该在 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'


这是重现问题的最小代码片段:

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
的调用成功了。

ios ios8 nsfilemanager
2个回答
5
投票

我向 Apple 提出了一个错误,他们将其作为重复项关闭。虽然这并不一定证实他们认为这是一个错误,但它至少证实我不是第一个遇到这种情况的人,而且这种行为确实随着 iOS 8 发生了变化。

目前,解决方案是在文件名前面添加

./
,或提供绝对路径。


0
投票

我昨天遇到了这个问题,我在这上面花了很多小时,也许是 4 个小时。分析问题,发现没有问题。

因此,我更改了资产并且构建按预期进行。我认为旧资产由于某些隐含的原因而存在问题 - 我正在尝试将资产转换为 base64 格式。

仅供参考:我正在使用 XCode 为我的 Flutter 应用程序插件进行 Swift 开发。

© www.soinside.com 2019 - 2024. All rights reserved.