C - Linux稀疏文件:如何检查文件是否稀疏并打印0填充的磁盘块

时间:2014-02-01 14:46:13

标签: c linux sparse-matrix stat readdir

我想要做的是在linux上编写一个C程序,如果有稀疏文件,应该在当前目录中检查,并且我还要打印已经代表文件间隙的磁盘块数量以及填充0但占用磁盘空间的磁盘块数。

到目前为止,我可以访问当前目录并使用

打印文件
DIR *dirp;
struct dirent *dp;

为了完成第二部分的稀疏文件,我尝试使用stat(),但似乎没有工作,因为我没有按照我的意愿得到所需的结果。

那么,有人能告诉我如何用稀疏文件做这个部分吗?

3 个答案:

答案 0 :(得分:5)

如果您想在稀疏文件中查找漏洞,请参阅lseek的联机帮助页,特别是有关SEEK_HOLESEEK_DATA的内容。

如果您只想知道磁盘上已分配的大小,请查看stat (2)的联机帮助页:

       struct stat {
           ...
           off_t     st_size;    /* total size, in bytes */
           ...
           blksize_t st_blksize; /* blocksize for file system I/O */
           blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
       };

st_size告诉您总大小(以字节为单位),st_blksize * st_blocks为您提供分配的大小。如果您将st_size舍入到st_blksize的下一个倍数并减去文件大小,那就是孔的大小。

答案 1 :(得分:1)

检查du实用程序返回的大小,并与“外观大小”进行比较。如果您愿意,可以从du

查看块计数算法

答案 2 :(得分:1)

您可以使用stat结果尝试以下技巧:

if (st.st_blocks * st.st_blksize < st.st_size) { 
  SPARSE-FILE 
} else { 
  PROBABLY NOT SPARSE
}

不确定它是否识别所有稀疏文件。