为什么在创建新文件时使用NSFileManager而不是仅使用NSData的writeToFile:atomically:方法?

max*_*son 20 iphone cocoa-touch objective-c nsfilemanager ios

考虑以下两个代码示例:

    NSData *imgData = UIImagePNGRepresentation(imgFull);
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];   
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
    [imgData writeToFile:fullPath atomically:YES];
Run Code Online (Sandbox Code Playgroud)

NSData *imgData = UIImagePNGRepresentation(imgFull);
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];   
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil];
Run Code Online (Sandbox Code Playgroud)

第二个示例需要额外的代码行和NSFileManager对象的初始化,而第一个示例只需要NSData对象imgData将自身写入文件.第一个示例的另一个优点是它可以覆盖具有相同名称的预先存在的文件.

我的问题是:在创建新文件时,在什么情况下你真的想要使用NSFileManager及其方法createFileAtPath:contents:attributes:

Rob*_*ier 38

NSFileManager方法的优点是attributes:

包含要与新文件关联的属性的字典.您可以使用这些属性来设置所有者和组编号,文件权限和修改日期.有关键列表,请参阅"文件属性键".如果为属性指定nil,则使用一组默认属性创建文件.

此功能在iOS上使用不常见,但NSFileManager比iOS要早.

顺便说一下,您所描述的额外线路几乎从未出现在实际代码中.您已经有一个fileManager由于其他原因而使用的变量,或者您将这两行合并为一个:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil];
Run Code Online (Sandbox Code Playgroud)

还有一个.如你所知:

第一个示例的另一个优点是它可以覆盖具有相同名称的预先存在的文件.

嗯,这取决于你想要什么,这是一个优势或劣势.如果您的意思是"创建此文件,但如果它已经存在则不覆盖它",那么FM方法会更方便.也许覆盖现有文件是错误的; 这可以节省你的电话fileExistsAtPath:.也许你想创建一个空文件,如果它不存在,但如果是的话就不管它.简单:传递[NSData data]contents值.

那么哪个更好取决于你正在解决的问题.