【问题标题】:How to erase files in Objective-C如何在 Objective-C 中擦除文件
【发布时间】:2014-06-30 07:40:02
【问题描述】:

我正在尝试寻找一种方法来使用 Objective-C(或 Swift)擦除磁盘上的文件。

Apple 是否提供“内置”解决方案来覆盖当前磁盘位置的文件?还是 Mac OS X 总是将文件写入其原始位置?

搜索网络(和 StackOverflow)只显示有人想要“删除”文件的线程。我可以尝试将垃圾写入我想擦除的文件中,但如果 OS X 将新内容写入磁盘上的不同位置,这对我没有帮助。

我尝试使用 Spotlight 搜索提供的元数据检索位置,但这些结果不包含文件位置。

我有点坚持,任何线索将不胜感激。

编辑 我确实查看了有关文件访问的 Apple 文档。它说

当您在写入文件后关闭文件时,系统会将零写入您的代码未触及的文件的任何部分。

截断文件以匹配您写入的数据的长度。对于您打算删除的暂存文件,请将文件截断为零长度。

如果我做对了,这意味着当我打开文件时应该“删除”文件,将长度截断为零并保存。然后文件系统应该用零覆盖内容。

来源(底部的“零填充延迟提供安全性”部分):https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/PerformanceTips/PerformanceTips.html#//apple_ref/doc/uid/TP40010672-CH7-SW1

【问题讨论】:

  • 您想以不可恢复的方式删除文件?
  • 如果您知道文件的路径 URL。使用 FileManager 方法之一擦除文件。 NSFileManager
  • @BryanChen 是的,我希望它们不可恢复(如果可能的话)。

标签: objective-c cocoa swift


【解决方案1】:

如果要打开现有文件并覆盖数据,请使用 NSFileHandle*

它会做你需要的一切。

+ (id)fileHandleForUpdatingAtPath:(NSString *)path

将打开文件,并寻找开头。除非您寻求到最后,否则后续调用

[myHandle write: data] 将覆盖文件的内容。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsfilehandle_Class/Reference/Reference.html

【讨论】:

  • 当然,我可以覆盖文件的内容或在偏移量 0 处截断它。但这是否确保新的“内容”将被写入原始文件所在的完全相同的位置?
  • 这更多的是文件系统将做什么的问题(可能是 HFS+)它也可能受到您正在写入的媒体类型的影响。如果这是 SSD,那么您可能会得到与旋转 rust HD 截然不同的结果,因为由于芯片组级别的写入平衡算法,闪存仍可能以可恢复的方式保留数据。
  • 我偶然发现了 Apple 文档中的一个小块(请参阅我在问题中的编辑)。考虑到磁盘类型(SSD 与 HDD),我将使用“擦除机制”的选择留给用户。
  • 我已经尝试过您提到的方式,它似乎有效。打开一个文件,将其大小截断为 0 并关闭它会生成一个 0 字节的文件。但是:有什么方法可以检查它是否真的只包含零字节?
  • 如果您只是截断,几乎可以肯定字节仍然存在于物理介质上。文件系统将永远不会再看到它们,但可以使用特殊的磁盘工具来恢复它们。
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多