我需要做的是以最快的方式用零填充整个文件内容。 我知道一些像cp
这样的linux命令实际上得到了什么是一次写入的最好的块大小信息,但我无法弄清楚使用这个块大小的信息是否足够有一个不错的性能,看起来像st_blksize
stat()
不给我那个块的大小。 谢谢 !
评论的一些答案:
这需要在C中完成,而不是使用碎片等工具。
stat()
的用法没有错误
st_blksize
正在返回一个大于文件大小的块,不知道该如何处理。
使用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