iPhone/Objective C:无法删除文件

Posted

技术标签:

【中文标题】iPhone/Objective C:无法删除文件【英文标题】:iPhone/Objective C: Can't delete a file 【发布时间】:2010-08-04 10:39:27 【问题描述】:

在我的应用程序中,我让用户录制声音片段,然后,如果用户选择,我希望他能够删除它。

这是我使用的代码:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSLog(@"File exists: %d", [fileManager fileExistsAtPath:path]);
NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]);
[fileManager removeItemAtPath:path error:&error];
if (error != nil)

    NSLog(@"Error: %@", error);
    NSLog(@"Path to file: %@", path);

问题是fileExistsAtPathisDeletableFileAtPath返回null而removeItemAtPath不起作用,并抛出这个错误,

错误:Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x391b7f0“操作无法完成。(Cocoa 错误 4.)”

路径有这种形式:

/Users/andrei/Library/Application%20Support/iPhone%20Simulator/User/Applications/5472B318-FA57-4F8D-AD91-7E06E9609215/Documents/1280913694.caf

那里有一个名为1280913694.caf 的文件,但它没有找到它。是否与路径的表示方式有关?

该路径在使用AVAudioPlayer 播放音频文件时有效。

我还将fileExistsAtPathisDeletableFileAtPath%@ 更改为%d,答案是0,我想这意味着FALSE。

文件名存储在数据库中,使用此方法检索文件的路径:

-(NSString *)returnFullPathToDirectory

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return documentsDirectory;

得到这个值后,我在下面的代码中使用它

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

【问题讨论】:

请将-removeItemAtPath前的两个%@改成%d再运行。 注意file://前缀必须去掉,即转换为NSURL并获取.path属性(确实是上面的路径) 【参考方案1】:

您对 (error != nil) 的检查不正确。您应该将 BOOL 设置为方法的返回值,并使用它来处理错误情况,因为方法可能成功完成并且之后错误可能不为零。因此,该文件实际上可能已被删除,但您却得到了一个不正确的错误。

如果文件不存在,您也不应该尝试删除它。

另外,我通常只记录错误的本地化描述,因为这样更容易阅读

此代码在我的项目中有效(路径在别处定义):

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    BOOL fileExists = [fileManager fileExistsAtPath:path];
    NSLog(@"Path to file: %@", path);        
    NSLog(@"File exists: %d", fileExists);
    NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:path]);
    if (fileExists) 
    
        BOOL success = [fileManager removeItemAtPath:path error:&error];
        if (!success) NSLog(@"Error: %@", [error localizedDescription]);
    

相关答案: NSError: Does using nil to detect Error actually turn off error reporting?

【讨论】:

【参考方案2】:

url 编码的文件路径对我来说看起来很可疑。我在某处读到 iPhone 文件路径现在应该用 URL 表示,但我认为空格不需要进行 url 编码。

尝试从路径中删除 %20 并重试?

【讨论】:

我让文件路径为:/Users/andrei/Library/Application Support/iPhone Simulator/User/Applications/0547AE74-AD10-4BEF-98CF-8FFF5BB2F70F/Documents/1280913694.caf 所以,没有 %20,现在......这很奇怪,它告诉我该文件不存在(在 fileExistsAtPath 返回 0),而且该文件是可删除的(在 isDeletableFileAtPath 返回 1)。错误仍然存​​在,并未删除文件。 能否请您发布用于检索路径的代码? 您能否在设备上进行测试以排除涉及模拟器应用程序路径的一些奇怪问题? 不,我不能,我没有测试设备,只有 XCode。 我在代码中看不到任何明显错误,所以除了尝试在设备上测试它之外,我不知道有什么建议,如果你能弄到一个。二手 iPod touch 就足够了,而且相当便宜。【参考方案3】:

尝试改变

NSFileManager *fileManager = [NSFileManager defaultManager];

到:

NSFileManager *fileManager = [NSFileManager new];

【讨论】:

这是正确的objective-c吗?

以上是关于iPhone/Objective C:无法删除文件的主要内容,如果未能解决你的问题,请参考以下文章

iphone / Objective c的最佳代码片段网站是啥[重复]

iPhone Objective C - 保存数据

在 iPhone Objective C 中的 UIDatePicker 中禁用过去日期

Node.Js 是不是与 iPhone Objective C 应用程序开发兼容?

如何从 json-rpc webservice 获取数据:iPad /iPhone / Objective C

iPhone(Objective-c)和Java之间的AES区别