可以通过下面的方式获得文件或文件夹的大小,其中fd 是文件(夹)的file descriptor
long fileSize = lseek(fd, 0, SEEK_END)
但是存在下面的问题
CT6.3
如果传给lseek的fd是一个regular file,没有问题;
如果传给lseek的fd是一个目录,而不是文件,那么会返回一个固定值 9223372036854775807 (0x 7FFF FFFF FFFF FFFF),因为Linux下的目录也是一个文件;
如果传给lseek的fd是一个非空目录,下面有文件并且不为空文件,那么返回的仍然是那些固定值,而不是该目录下所有文件的大小之和
CT4.4
如果传给lseek的fd是一个regular file,没有问题;
如果传给lseek的fd是一个目录(不论是否为空),而不是文件,那么会返回一个固定值 4096,因为Linux下的目录也是一个文件
不管是CT4.4的 4096返回值,还是CT6.3的 9223372036854775807 返回值,都是不对的。事实上,对一个目录做 lseek(fd, 0, SEEK_END) 就已经不对了。
如果真的对一个目录做了 lseek(fd, 0, SEEK_END) 操作,并且将返回值认作是“文件”大小的话,对CT4.4 来说,也就4K大小,但对CT6.3 来说,就悲剧了:9223372036854775807,这么大的数字,如果以它作为文件大小加载文件,并事先分配那么大的内存空间,内存就撑爆了,因为 9223372036854775807 就是 0x 7FFF FFFF FFFF FFFF = 2 ^ 63 - 1,相当于 2 ^ 33 G!
这里的CT6.3 下的 “对目录做lseek(fd, 0, SEEK_END) 操作返回天文数字” 的情况,可以说是lseek() 函数的一个bug吗?