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

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

评论的一些答案:

  1. 这需要在C中完成,而不是使用碎片等工具。

  2. stat()的用法没有错误

  3. st_blksize正在返回一个大于文件大小的块,不知道该如何处理。

  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); 

显然这将是很好的添加一些错误检查。

这个解决方案并不是你想要安全地删除文件的东西。 它将简单地将文件使用的旧块标记为未使用,并留下不占用任何物理空间的稀疏文件。 如果要从物理存储介质中清除文件的旧内容,可以尝试如下所示:

 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左右,但是超出某个特定点则不应该有所帮助,这只是一种浪费。

与mmap(并没有错误检查):

 stat(filename,&stat_buf); len=stat_buf.st_size; fd=open(filename,O_RDWR); ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); memset(ptr,0,len); munmap(ptr,len); close(fd); 

这应该使用内核的块大小的想法,所以你不必担心它。 除非文件大于你的地址空间。

这是我的想法; 注意我清除了每个错误检查代码。

 int f = open("file", "w"); // open file int len = lseek(f, 0, SEEK_END); // and get its length lseek(f, 0, SEEK_BEG); // then go back at the beginning char *buff = malloc(len); // create a buffer large enough memset(buff, 0, len); // fill it with 0s write(f, buff, len); // write back to file close(f); // and close