从dirent struct打印off_t文件大小

时间:2013-12-11 19:51:31

标签: c printf opendir

我想要的只是以字节为单位打印文件的大小 我正在使用

DIR *d;
struct dirent *dir;
d= opendir(absolute_path);

while((dir= readdir(d))!=NULL){
    printf("%s\t %d\t %u\n",dir->d_name,dir->d_type,(int long long )dir->d_off);
}

打印类型为off_t的d_off是错误的。 对于323,388 bytes的文件,它会打印1296623584

我认为铸造是个问题。我尝试过很多演员,例如%d%s%u%llu ...... 什么是正确的铸造?

编辑:用于查找文件大小的正确函数是使用stat结构lstat()

2 个答案:

答案 0 :(得分:2)

来自readdir手册页:

  

在POSIX.1-2001中仅指定字段d_name和d_ino。其余字段可用于许多系统,但不是所有系统。在glibc下,程序可以通过测试是否定义了宏_DIRENT_HAVE_D_NAMLEN,_DIRENT_HAVE_D_RECLEN,_DIRENT_HAVE_D_OFF或_DIRENT_HAVE_D_TYPE来检查POSIX.1中未定义的字段的可用性。

     

d_off中返回的值与通过在目录流中的当前位置调用telldir(3)返回的值相同。请注意,尽管它的类型和名称,d_off字段很少在现代文件系统上的任何类型的目录偏移量。应用程序应将此字段视为不透明值,不对其内容进行任何假设;另见telldir(3)。

要查找文件的大小,请参阅How do you determine the size of a file in C?

答案 1 :(得分:1)

正如@Andrey指出的那样,d_off的值并不总是有用甚至存在。例如,OSX没有它。请改为使用stat来电话。