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

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

到目前为止,我可以访问当前的目录,只打印文件

DIR *dirp; struct dirent *dp; 

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

那么,谁能告诉我如何用稀疏文件做零件?

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

如果你想知道磁盘上分配的大小,那么看一下manpage的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的下一个倍数并减去文件大小,那就是洞的大小。

检查尺寸,由du utility返回,并与“外观尺寸”进行比较。 如果你希望你可以看看du从块计数算法

统计结果你可以尝试下面的技巧:

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

不知道是否识别所有稀疏文件。