我需要做的是以最快的方式用零填充整个文件内容。我知道一些像 cp
这样的 linux 命令实际上一次获得了最好的 block 大小信息,但是我无法弄清楚使用这个 block 大小信息是否足以有一个很好的性能,看起来像 stat()
中的 st_blksize
没有给我那个 block 大小。
谢谢!
评论的一些回答:
这需要在 C 中完成,而不是使用像 shred 这样的实用程序。
的使用没有错误stat()
st_blksize
返回一个大于文件大小的 block , 不知道我该如何处理。使用truncate()/ftruncate(),只填充多余的空间 零,我需要覆盖整个文件数据。
我在想:
fd = open("file.txt", O_WRONLY);
// check for errors (...)
while(TRUE)
{
ret = write(fd, buffer, sizeof(buffer));
if (ret == -1) break;
}
close(fd);
问题是如何“以编程方式”定义最佳缓冲区大小。
最佳答案
最快最简单的:
int fd = open("file", O_WRONLY);
off_t size = lseek(fd, 0, SEEK_END);
ftruncate(fd, 0);
ftruncate(fd, size);
显然,添加一些错误检查会很好。
虽然此解决方案不是您想要安全删除文件的解决方案。它会简单地将文件使用的旧 block 标记为未使用,并留下一个不占用任何物理空间的稀疏文件。如果你想从物理存储介质中清除文件的旧内容,你可以尝试这样的事情:
static const char zeros[4096];
int fd = open("file", O_WRONLY);
off_t size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
while (size>sizeof zeros)
size -= write(fd, zeros, sizeof zeros);
while (size)
size -= write(fd, zeros, size);
如果测试表明它可以提高性能,您可以将 zeros
的大小增加到 32768 左右,但超过某个点它应该没有帮助,只会浪费。
关于c - 在 C 中用零覆盖整个文件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392110/