【问题标题】:Allocate file on NTFS without zeroing在 NTFS 上分配文件而不归零
【发布时间】:2014-08-04 12:57:36
【问题描述】:

我想做一个类似zerofree for linux的工具。我想通过分配一个大文件而不将其归零来做到这一点,寻找非零块并重写它们。

如果有管理员权限,uTorrent 可以这样做:http://www.netcheif.com/Articles/uTorrent/html/AppendixA_02_12.html#diskio.no_zero,但它是封闭源代码。

【问题讨论】:

  • 你要的函数是SetFileValidData
  • 嘿,编辑了我的答案并包含了更合适的信息,所以如果还没有找到解决方案,你应该看看。
  • 如果我理解正确,zerofree 与您想要的完全相反:“在 [...] 文件系统中找到未分配的非零块并用零填充它们”。不?实际上,您确实希望将数据归零(通过创建一些大型内存映射是最简单和最快的)。不过,您似乎确实想在稀疏文件中创建“洞”?
  • @Damon 重点是:99% 的可用空间可能已经为零。我不想再重写了。防止动态虚拟磁盘映像增长尤为重要。

标签: winapi file-io ntfs


【解决方案1】:

我不确定这是否能回答您的问题(需要),但这样的工具已经存在。你可以看看 fsutil.exe Fsutil command line tool。该工具具有发现 NTFS 文件内部结构的巨大潜力,还可以创建任意大小的文件(无需手动归零)。希望对您有所帮助。

【讨论】:

  • 你的意思是fsutil file createnew?结果归零
  • 啊,还有另一个命令fsutil file setvaliddata E:\bigfile 9001 有效。
  • @basin 感谢您的评论!非常感谢。是的,这就是我的意思。
  • 当我输入 fsutil file setvaliddata E:\bigfile 9001 时,我得到:Error: The parameter is incorrect.
【解决方案2】:

写了一个工具https://github.com/basinilya/winzerofree。它使用SetFileValidData() @RaymondChen 建议

【讨论】:

  • 正是我需要的!它也有效:与 SDelete 不同,它不会通过写入已经为零的扇区来破坏 Hyper-V 检查点的大小。如果您将二进制版本上传到 GitHub,这将帮助那些不能直接推出 VS 并构建它的人。
【解决方案3】:

你应该试试SetFilePointerEx

注意,将文件指针设置到某个位置并不是错误 超出文件末尾。

所以在创建文件后,调用SetFilePointerEx,然后调用SetEndOfFileWriteFileWriteFileEx 并关闭文件,大小应该会增加。

编辑

Raymonds 建议SetValidData 也是一个很好的解决方案,但这需要权限,所以任何人都不应该经常使用。 我的解决方案在 NTFS 上是最好的,因为它支持称为 initialized size 的功能,这意味着使用 SetFilePointerEx 后数据不会被初始化为零,但在尝试读取未初始化的数据后,您将收到零。

总结一下,如果 NTFS 使用SetFilePointerEx,如果 FAT(不太可能)- 使用SetValidData

【讨论】:

  • 但这也会将新字节归零。
  • @Raymond 我没有测试这个...文档是这样说的吗?
  • 扩展字节的内容未定义。在 NTFS(问题中指定的文件系统)上,出于安全原因,扩展字节的内容将为零。
  • 思想数据总是不确定的,你能给个文档链接吗?
  • 由于您的目标是确保有意未初始化扩展字节,因此内容未定义的事实不符合您的目标。因为未定义可能意味着“无论如何都归零”,这不是您想要的。你想要一些明确地使内容保持未初始化的东西,这就是 SetValidData 所做的。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2018-12-19
相关资源
最近更新 更多