【问题标题】:C - Linux Sparse File: How to check if file is sparse and print 0-filled disk blocksC - Linux 稀疏文件:如何检查文件是否稀疏并打印 0 填充的磁盘块
【发布时间】:2014-02-25 07:00:08
【问题描述】:

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

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

DIR *dirp;
struct dirent *dp;

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

那么,谁能告诉我如何处理稀疏文件的部分?

【问题讨论】:

    标签: c linux sparse-matrix stat readdir


    【解决方案1】:

    您可以尝试以下技巧与统计结果:

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

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

    【讨论】:

    • 你确定这会返回所有稀疏文件吗?
    • @user2965601 我对原始代码进行了一些编辑。无论如何,如答案所示,我不确定它是否找到所有稀疏文件。
    • 这个答案肯定是错的。 st_blocks 是最佳 I/O 大小,它与 st_blksize 没有任何关系。
    【解决方案2】:

    如果您想在稀疏文件中查找漏洞,请参阅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 的下一个倍数并减去文件大小,这就是孔的大小。

    【讨论】:

    • 嗨,我不明白“如果将 st_size 向上舍入到 st_blksize 的下一个倍数并减去文件大小,这就是孔的大小”部分。你能解释一下吗?
    • 我的意思是,如何将 st_size 舍入到 st_blksize 的下一个倍数?
    • 类似:off_t sz = (st.st_size + st.st_blksize - 1) &amp; ~st.st_blksize。这利用了st_blksize 始终是 2 的幂的事实,并且二进制 &amp; 与 2 的幂的补码会将相关位四舍五入到 2 的幂,所以如果你添加二减一,四舍五入为二的幂。
    • 计算没那么简单。您必须考虑间接块,这使得 st_blocksst_size 的预期更高,而稀疏性使其更低。
    • @WumpusQ.Wumbley 我不确定这是否正确,因为我正在四舍五入表观文件大小(即包括孔)。 du 的作用在这里:git.savannah.gnu.org/cgit/coreutils.git/tree/src/du.c#n532;我看不到从宏中进行间接块计算。但是,复制第 535 行将是微不足道的。
    【解决方案3】:

    检查由du 实用程序返回的大小,并与“表观大小”进行比较。如果您愿意,可以查看du的块计数算法

    【讨论】:

    • 我刚刚在 du 手册页中查找。这是一个 shell 命令,但我不使用 shell 命令 du。好吧,我根本不使用 shell 命令。难道没有其他方法可以完成这项工作吗?
    • 应该可以用 stat() 来完成,不是吗?
    • 请注意,这取决于文件系统——例如,在启用压缩的 ZFS 上,非稀疏文件可能会显示为使用的空间小于其表观大小。
    猜你喜欢
    • 2018-04-13
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2014-08-12
    • 2014-10-03
    • 2023-03-08
    相关资源
    最近更新 更多