文件的长度

简介: 文件的长度

在文件属性的 stat 结构体中,有一个成员 st_size 指定了以字节为单位的文件长度。此字段只对普通文件目录文件符号链接文件有意义。


对于普通文件而言,其文件长度可以是 0 ,在读这种文件时,将得到文件结束指示

对于目录而言,文件长度通常是一个数,如 16512 的整倍数。


对于符号链接文件而言,文件长度是文件名的实际字节数,如下所示:

$ 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 字符。


空洞文件

普通文件有时会出现空洞空洞是位移超过文件结尾端,并写入某些数据造成的。文件空洞不占用任何磁盘空间,直到某个时间点,文件空洞中写入数据时,文件型系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能比其占用的磁盘存储空间要大(有时大出很多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。

微信截图_20221209142914.png


我们可以通过命令查询空洞文件,如下所示:

$ 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 。很明显,此文件就是一个空洞文件。无空洞文件的文件大小和占用磁盘空间是一样的。


空洞文件的应用场景如下:

  1. 使用下载工具下载文件时,在未下载完的情况下,就可以看到文件的总大小,包括当前已经下载的数据的大小,以及剩余未下载的数据大小。文件在未下载完成时就已经占据了整个文件所需的空间,这样可以预防使用过程中空间不足。
  2. 创建虚拟机的时候,创建了一个100GB的磁盘镜像,但是其实刚装起系统时只使用了3~4GB的磁盘空间,如果一开始就把100GB分配出去,对资源是很大的浪费。


提示

关于空洞文件的生成可以参考笔记:文件定位

目录
相关文章
|
4月前
求一个字符串的长度
求一个字符串的长度。
49 11
|
4月前
数组的长度
数组的长度不可以发生改变。 但是ArrayList集合的长度是可以随意变化的。 对于ArrayList来说,有一个尖括号代表泛型。 泛型:也就是装在集合当中的所有元素,全都是统一的什么类型。 注意:泛型只能是引用类型,不能是基本类型。 注意事项: 对于ArrayList集合来说,直接打印得到的不是地址值,而是内容。如果内 容是空,得到的是空的中括号:[]
32 3
|
4月前
数组的长度
数组的长度不可以发生改变。 但是ArrayList集合的长度是可以随意变化的。 对于ArrayList来说,有一个尖括号代表泛型。 泛型:也就是装在集合当中的所有元素,全都是统一的什么类型。 注意:泛型只能是引用类型,不能是基本类型。 注意事项: 对于ArrayList集合来说,直接打印得到的不是地址值,而是内容。如果内 容是空,得到的是空的中括号:[]
29 0
|
存储 编解码 缓存
|
存储
字符串按照固定长度分割并存储在数组
字符串按照固定长度分割并存储在数组
168 0
文件的长度,跟FileReader读到的长度,不一样
文件的长度,跟FileReader读到的长度,不一样
113 0
GetUserName()第二个参数中指明缓冲区长度
GetUserName()第二个参数中指明缓冲区长度
115 0