在什么情况下fseek / ftell或fstat会无法获得文件的大小?

时间:2016-11-28 20:56:29

标签: c file

我正在尝试将文件作为char数组访问,通过内存映射,或将其复制到缓冲区或其他任何东西,但这两者都需要文件的大小,很容易,我想,只需使用fseek (档案,0,SEEK_END)。

但是:根据C++ Reference“允许[fseek]的库实现不能有意义地支持SEEK_END,”这意味着我无法使用该方法获取文件的大小。

接下来我尝试了fstat,它不太便携,但至少会提供编译错误而不是运行时问题;但是The Open Group注意到fstat不需要为st_size提供有意义的值。

所以:有没有人真正遇到过这些方法不起作用的系统?

1 个答案:

答案 0 :(得分:2)

关于没有报告有效大小的文件的注释是存在的,因为在Linux中,有许多"文件"其中"文件大小"这不是一个有意义的概念。

主要有两种情况:

  • 该文件不是常规文件。特别是,管道,套接字和字符设备文件是数据流,其中数据在读取时消耗,而不是放在磁盘上,因此大小没有多大意义。
  • 文件所在的文件系统未提供文件大小。这在"虚拟"中尤为常见。文件系统,其中文件内容在读取时生成,并且再次没有磁盘备份。

    要扩展,文件系统不一定将文件内容保存在磁盘上。由于文件系统API是用于表达分层数据的方便API,并且有许多用于操作文件的工具,因此有时将数据公开为文件层次结构是有意义的。例如,/proc/包含有关进程的信息(例如打开文件和已用内存),/sys/包含特定于驱动程序的信息和选项(从传感器采样率到LED颜色的任何内容)。使用FUSE(UserSpacE中的文件系统),您可以对文件系统进行编程以完成任何操作,从SSH连接到远程计算机,再将Twitter作为文件系统公开。

    对于很多这些文件系统,"文件大小"可能没什么意义。例如,LED驱动程序可能会显示三个文件redgreenblue。可以读取它们以获取当前颜色或写入以更改颜色。现在,是否真的值得为它们实现文件大小,因为它们只是RAM中的设置,没有任何磁盘支持,并且无法删除?不是真的。

总之,文件不一定是磁盘上的东西"。对于许多更高级的文件用法,"文件大小"要么没有意义,要么不值得提供。