在文件属性的 stat
结构体中,有一个成员 st_size
指定了以字节为单位的文件长度。此字段只对普通文件、目录文件和符号链接文件有意义。
对于普通文件而言,其文件长度可以是 0
,在读这种文件时,将得到文件结束指示。
对于目录而言,文件长度通常是一个数,如 16
或 512
的整倍数。
对于符号链接文件而言,文件长度是文件名的实际字节数,如下所示:
$ ls -l taos.h lrwxrwxrwx 1 root root 30 6月 23 2021 taos.h -> /usr/local/taos/include/taos.h点击复制复制失败已复制
其中,文件长度 30
指的是路径名 /usr/local/taos/include/taos.h
的长度,可以数一数,正好 30
个字符。
注意
因为符号链接文件长度总是由 st_size
指示,所以符号链接并不包含通常 C
语言用作名字结尾的 null
字符。
空洞文件
普通文件有时会出现空洞。空洞是位移超过文件结尾端,并写入某些数据造成的。文件空洞不占用任何磁盘空间,直到某个时间点,文件空洞中写入数据时,文件型系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能比其占用的磁盘存储空间要大(有时大出很多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。
我们可以通过命令查询空洞文件,如下所示:
$ ls -l test.txt -rw-rw-r-- 1 iric iric 65550 8月 20 14:56 test.txt $ du -sh test.txt 8.0K test.txt点击复制复制失败已复制
文件 test.txt
的长度超过 64KB
,而 du
命令报告该文件所使用的磁盘空间总量是 8.0KB
。很明显,此文件就是一个空洞文件。无空洞文件的文件大小和占用磁盘空间是一样的。
空洞文件的应用场景如下:
- 使用下载工具下载文件时,在未下载完的情况下,就可以看到文件的总大小,包括当前已经下载的数据的大小,以及剩余未下载的数据大小。文件在未下载完成时就已经占据了整个文件所需的空间,这样可以预防使用过程中空间不足。
- 创建虚拟机的时候,创建了一个
100GB
的磁盘镜像,但是其实刚装起系统时只使用了3~4GB
的磁盘空间,如果一开始就把100GB
分配出去,对资源是很大的浪费。
提示
关于空洞文件的生成可以参考笔记:文件定位