【问题标题】:Write NSData to a file?将 NSData 写入文件?
【发布时间】:2010-08-28 21:15:13
【问题描述】:

我正在尝试将 nsdata 写入磁盘上的文件,我有以下代码但它不起作用,我做错了什么吗?

Boolean result = [data writeToFile:@"/Users/aryaxt/Desktop/test2.avi" atomically:YES];

test2.avi 不存在,我假设 writeToFile 会为我创建它

【问题讨论】:

  • 附带说明,您应该在 Objective-C 中使用 BOOL,而不是 Boolean
  • 试试-[NSData writeToFile:options:error] (developer.apple.com/mac/library/documentation/Cocoa/Reference/…) 告诉我们报告了什么错误。
  • (请在调试器中验证数据不为零;也许图像也是零;-)
  • 我在多线程应用程序中遇到了同样的问题。使用 assert([data length] > 0) 作为防御性编程风格。

标签: objective-c cocoa nsdata


【解决方案1】:

尝试使用:

NSError *error = nil;
path=@"/Users/aryaxt/Desktop/test2.avi";
[data writeToFile:path options:NSDataWritingAtomic error:&error];
NSLog(@"Write returned error: %@", [error localizedDescription]);

这会告诉你写入失败的原因。

【讨论】:

  • error 仅应在方法返回 NO 时检查。基础类可能会将其他对象或虚假错误甚至垃圾放入错误参数中。 (这并不是说他们,但这是程序员合同的一部分,他们可以做到,所以要小心。)
  • 我有一个与文档无关的附带问题:讨论 写入可公开访问的文件时,此方法可能不合适。要安全地将数据写入公共位置,请改用 NSFileHandle。有关更多信息,请参阅 Secure Coding Guide 中的Securing File Operations。”那么我还应该使用它吗?
  • “可公开访问的文件”是什么意思?
  • 很多人都赞成乔纳森关于仅在方法返回 NO 时检查 error 的评论。我同意,这对于发布的生产代码是正确的,并且在向用户发送错误时更是如此。此处省略了检查,部分原因是为了简洁,部分原因是在这种情况下,NSLog() 调用用于在开发期间进行调试。
  • 这段代码很老,没有考虑沙盒。此外,请查看 Apple 安全编码指南 Race Conditions and Secure File Operations 中的警告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2010-10-15
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多