【问题标题】:Why use an NSFileManager rather than just using NSData's writeToFile:atomically: method when creating a new file?为什么在创建新文件时使用 NSFileManager 而不是仅使用 NSData 的 writeToFile:atomically: 方法?
【发布时间】:2012-03-17 00:50:19
【问题描述】:

考虑以下两个代码示例:

    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];

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];

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

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

【问题讨论】:

  • 根据我的经验,NSData 的 writeToFile 默认不会覆盖。 NSFileManager 的 createFileAtPath 也没有属性:nil。 NSDictionary方法的attributes信息即将发布,说明不常用。

标签: iphone objective-c ios cocoa-touch nsfilemanager


【解决方案1】:

最近,我发现writeToFile:atomically: 在对代码进行单元测试时不太合适。为了让测试更舒适,我不得不将NSFileManager 注入到类中,并且在测试中我使用了模拟文件管理器来验证行为。

【讨论】:

    【解决方案2】:

    据我所知,在 Rob 阅读答案后,大多数文件操作都可以使用共享文件管理器对象执行。因为每条路径只生成一次。所以不会出现覆盖情况。如果我错了,请纠正。

    【讨论】:

      【解决方案3】:

      NSFileManager 方法的优点是attributes 字段:

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

      这个功能在 iOS 上不常见,但NSFileManager 比 iOS 早很多。

      顺便说一句,您所描述的额外行几乎从未出现在实际代码中。要么您已经有一个 fileManager 变量,但您出于其他原因正在使用该变量,或者您将这两行合二为一:

      [[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil];
      

      还有一个。如您所述:

      第一个示例的另一个优点是它可以覆盖已存在的同名文件。

      嗯,这取决于你想要什么,这是一个优势或劣势。如果你的意思是“创建这个文件,但如果它已经存在就不要覆盖它”,那么 FM 方法要方便得多。覆盖现有文件可能是错误的;这样可以节省您拨打fileExistsAtPath: 的电话。如果它不存在,也许您想创建一个空文件,但如果它存在,请不要理会它。很简单:将[NSData data] 作为contents 值传递。

      所以哪个更好取决于您要解决的问题。

      【讨论】:

      • 很好的答案,感谢您简要介绍了 NSFileManager 类的更广泛的、非 iOS 的存在理由。
      • 确实很好的答案。谢谢罗伯
      • 在 SandBox 下,它变得越来越不同。希望Rob可以升级答案。谢谢!
      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-06-13
      • 2015-10-10
      • 2018-10-06
      • 1970-01-01
      • 2017-01-09
      相关资源
      最近更新 更多