c - 在 C 中用零覆盖整个文件的最快方法是什么?

标签 c linux file unix file-io

我需要做的是以最快的方式用零填充整个文件内容。我知道一些像 cp 这样的 linux 命令实际上一次获得了最好的 block 大小信息,但是我无法弄清楚使用这个 block 大小信息是否足以有一个很好的性能,看起来像 stat() 中的 st_blksize 没有给我那个 block 大小。 谢谢!

评论的一些回答:

  1. 这需要在 C 中完成,而不是使用像 shred 这样的实用程序。

  2. stat()

    的使用没有错误
  3. st_blksize 返回一个大于文件大小的 block , 不知道我该如何处理。

  4. 使用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/

相关文章:

Java:如何从文件中读取文本和数字

perl - 即时创建文件并即时返回 (Perl)

c - 使用头文件时出现 undefined symbol 错误

linux - 如何查找文件中的第 n 个单词(Linux Shell)

Linux命令通过名称获取tomcat进程id

c# - File.ReadLines().ToList() 在包含 2 个空行的文件上的计数为 1?

c - 初始化动态数组c

c - IRC 机器人故障

c - 使用 offsetof 执行指针运算示例

windows - 低延迟/高性能网络(以太网)消息传递