【问题标题】:Zero'ing out a file清零文件
【发布时间】:2011-10-19 21:10:26
【问题描述】:

将全零写入文件的最有效、最快捷的方法是什么?包括错误检查。它只是fwrite吗?还是涉及 fseek?

我在别处看过类似的代码:

off_t size = fseek(pFile,0,SEEK_END);
fseek(pFile,0,SEEK_SET);

while (size>sizeof zeros)  
    size -= fwrite(&address, 1, sizeof zeros, pFile); 
while (size)    
    size -= fwrite(&address, 1, size, pFile); 

其中 zeros 是我怀疑的文件大小数组。不确定 off_t 到底是什么,因为它对我来说并不是直接直观的

【问题讨论】:

  • off_t 是一种类型,例如可以是unsigned int 用于表示偏移量。实际上,代码看起来还不错。
  • 您是否需要确保实际擦除磁盘上的位,或者是否足以使它们无法通过普通文件系统 API 访问?
  • 这不能回答我的问题。让我尝试另一种方式:如果有人卸载您的文件系统并使用取证实用程序检查硬盘驱动器的原始内容,并且他们在您用零覆盖之前找到文件中的位,会会坏吗?
  • 其实我还有一个问题:如果你只是用remove删除这个文件会出现什么问题?

标签: c file-io


【解决方案1】:

您想用相同长度的二进制零流替换文件的内容,还是只想清空文件? (使其长度为零)

无论哪种方式,最好使用 OS 文件 I/O 原语来完成。选项一:

char buf[4096];
struct stat st;
int fd;
off_t pos;
ssize_t written;

memset(buf, 0, 4096);
fd = open(file_to_overwrite, O_WRONLY);
fstat(fd, &st);

for (pos = 0; pos < st.st_size; pos += written)
    if ((written = write(fd, buf, min(st.st_size - pos, 4096))) <= 0)
        break;

fsync(fd);
close(fd);

选项二:

int fd = open(file_to_truncate, O_WRONLY);
ftruncate(fd, 0);
fsync(fd);
close(fd);

错误处理留作练习。

【讨论】:

    【解决方案2】:

    mmap() 和 memset()

    【讨论】:

    • 但是别忘了在memset之后msync,除非你munmap或者close。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多