我想要做的是在linux上编写一个C程序,如果有稀疏文件,应该在当前目录中检查,并且我还要打印已经代表文件间隙的磁盘块数量以及填充0但占用磁盘空间的磁盘块数。
到目前为止,我可以访问当前目录并使用
打印文件DIR *dirp;
struct dirent *dp;
为了完成第二部分的稀疏文件,我尝试使用stat()
,但似乎没有工作,因为我没有按照我的意愿得到所需的结果。
那么,有人能告诉我如何用稀疏文件做这个部分吗?
答案 0 :(得分:5)
如果您想在稀疏文件中查找漏洞,请参阅lseek
的联机帮助页,特别是有关SEEK_HOLE
和SEEK_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
}
不确定它是否识别所有稀疏文件。