| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1429 人关注过本帖
标题:类Unix系统中获取文件磁盘占用空间的问题
只看楼主 加入收藏
dragonsun7
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-6-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
类Unix系统中获取文件磁盘占用空间的问题
注意,不是获取文件大小,而是占用磁盘空间的大小。
例如我的~/.bash_profile文件,文件大小为238个字节,磁盘占用为4KB。

我使用了stat函数来获取文件信息,代码如下:
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, const char *argv[]) {
    struct stat statbuff;
    stat("/Users/XX/.bash_profile", &statbuff);
    printf("filesize = %lld, block = %lld, blocksize = %d\n", statbuff.st_size, statbuff.st_blocks, statbuff.st_blksize);

    return 0;
}

编译后运行的结果为:
filesize = 238, block = 8, blocksize = 4096
意思是,文件大小为238个字节,占用了8个块,每个块的大小为4096个字节
如果按照这个数据来计算,文件的磁盘占用应该为 8 * 4096 = 32KB

但是使用du -h ~/.bash_profile命令得到的结果是:
4.0K    /Users/XX/.bash_profile

不知道哪里出了问题,诚心向大家请教~



[此贴子已经被作者于2016-11-23 18:43编辑过]

搜索更多相关主题的帖子: include return Users 空间 信息 
2016-11-23 18:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:10 
文件实际占用大小 = st_blocks * 512
st_blksize 是指进行IO读写时最优的块大小
2016-11-24 08:33
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
文件以簇为单位存储,一簇的大小根据硬盘分区大小和决定,题主的信息提示是一簇为8个扇区,每个扇区512字节,因此题主的文件系统簇的大小为512*8=4096字节,该硬盘分区不大于256MB。
一个文件实际占用的空间计算公式是:(filesize/blocksize+(filesize%blocksize)&&1)*blocksize,因此,除非是一个文件大小刚好是簇的整数倍,否则即使只有1个字节,也要占用一个簇的空间。
以上信息为百度+个人理解,不到之处见谅!
2016-11-24 09:20
dragonsun7
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-6-20
收藏
得分:0 
谢谢两位版主。

其实道理也明白,就是一直疑惑到底该使用哪个参数来进行运算。

这是另一个文件的提示信息,其磁盘占用为16KB:
filesize = 14995, block = 32, blocksize = 4096

可以看出512这个值并不能根据stat函数返回的结果计算出来
一个block确定就是512字节这个常量吗?会不会因为磁盘容量大小、分区格式不同而变化呢?手上也没有多余的盘拿来验证

至于4096这个值,是IO一次读取的大小,那么这个值能不能在系统中设置(比如设置成8192)?如果设置了,会不会影响文件磁盘占用呢?(个人觉得不会,因为其它文件的磁盘占用是定了的)

[此贴子已经被作者于2016-11-24 14:05编辑过]

2016-11-24 14:02
dragonsun7
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-6-20
收藏
得分:0 
又去翻查了一下资料,基本上确认了stat结构体中的st_blocks就是指扇区数量,HFS+每个扇区的大小为512个字节,因此最简单的计算方法就是st_blocks * 512。

下面是资料来源:
http://baike.baidu.com/link?url=FEiCQBLRG-4zdpZXATDKNh-IEIKcybYxyFi6iWk2PpdfpJR7D31TqhM-xCJuIbGqDPGXY51l_hdtKHO1j_8Lk_
http://blog.
2016-11-24 14:21
快速回复:类Unix系统中获取文件磁盘占用空间的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039424 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved