objective-c - ios fileExistsAtPath 新文件失败

标签 objective-c ios nsdata nsfilemanager

我正在编写一个文件,然后将 NSURLIsExcludedFromBackupKey 属性添加到文件中。为此,我在 HPSFileHelper 类中使用了以下两种方法:

+(void)writeDataToFileWithData:(NSData*)data andFilename:(NSString*)fileName
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

    [data writeToFile:filePath atomically:YES];

    NSURL* fileURL = [NSURL fileURLWithPath:filePath];

    [HPSFileHelper addSkipBackupAttributeToItemAtURL:fileURL]; // Prevent this file from being backed up.
}

+(BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;

}

问题是 assert ... fileExistsAtPath 偶尔会失败。大概这是因为有时在断言运行时文件尚未完全写入和解锁? (对于大文件?)

我应该如何围绕这个问题进行编码?

最佳答案

解决此问题的最简单方法可能是对 writeToFile:atomically: 方法的 atomically: 参数使用 NO

  • atomically 写入文件意味着系统将文件内容写入一个临时文件,一旦全部写入,将文件移动到最终路径。 (这是为了确保在写入文件失败的情况下,例如,最终路径不包含未完成的文件内容)
  • 对此参数使用NO 将使系统将文件直接写入其最终目标/路径(而不是使用临时文件然后移动它)。

所以我的猜测是,当使用 atomically:YES 并因此使用临时文件时,当您调用 addSkipBackupAttributeToItemAtURL: 时,系统可能尚未完成写入临时文件(因此甚至没有开始将其移动到最终路径/目的地),它解释了为什么您的断言失败。

而使用 atomically:NO,当您调用 addSkipBackupAttributeToItemAtURL: 时,系统至少已经开始写入最终路径,您的断言应该不会失败.

关于objective-c - ios fileExistsAtPath 新文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12829091/

相关文章:

objective-c - 是否可以使用方法代替 block ?

objective-c - Cocoa:如何在 Cocoa 中禁用 Web View 的所有用户交互?

iphone - 如何使用NSJSONSerialization输出数据?

ios - NSData 未在 UIWebView lodadata 方法中正确加载

ios - FOR 命令中的表达式 (for (int i=0; i < ([arr count]-1);i++){})

IOS Core Telephony警告和应用商店查询

ios - Xcode 一直显示 :-1: SWIFT_VERSION '5.0' is unsupported, 支持的版本是 : 3. 0、4.0、4.2。任何解决方案?

ios - CFBundleVersion key 错误

ios - 如何从 NSdata 创建 AudioBuffer/Audio

ios - NSData 对象因未知原因为空(保存图像)