linux - Linux下C语言如何获取文件长度?

标签 linux file io filesize

我正在寻找与 Microsoft 的 _filelength 等效的内容在Linux中。我试过了,但这是不正确的。

long _filelength(char *f)
{
    struct stat st;
    stat(f, &st);
    return st.st_size;
}

if((hfile = fopen("data.arp","rb"))!=NULL)
    fsize = _filelength(fileno(hfile));

如何在 Linux 上用 C 语言获取文件长度?

最佳答案

I'm looking for the equivalent of _filelength in linux.

这是一种非常错误的方法,并且表现出错误的心态。 Linux 上没有与 Windows 的 _filelength 完全相同的文件。 Linux 不是 Windows,Windows 也不是 Linux。每个操作系统都有自己的API以及它自己的文件愿景(在 Linux 上,它们是 inode ,请参阅 inode(7) 以及 this 答案...)、进程等...Linux 大多兼容 POSIX,因此学习 POSIX 并阅读一些有关 Linux 系统编程的书,也许是旧的 ALP或者更新的东西。不要期望(甚至不要尝试)找到每个 Windows 或 WinAPI 的等效项。 Linux 上的功能。请参阅intro(2) , syscalls(2) , intro(3) .

仔细阅读stat(2) 。它需要一个字符串(某个文件路径),而不是 file descriptor (就像fstat一样)如 fileno(3) 给出的那样。它可能会失败(您需要了解原因,可能使用 errno(3) ,它永远不会是负数)。

顺便说一句,名称以 _ 开头的标识符被保留。

也许你可以尝试:

long filelength(const char*filpath) { // don't use that. Learn POSIX API
   struct stat st;
   if (stat(filpath, &st)) /*failure*/
      return -1; // when file does not exist or is not accessible
   return (long) st.st_size;
}

但实际上,您最好直接在程序中使用 stat(并在失败时检查 errno(3),而不仅仅是像上面那样简单地返回 -1),并且您可能应该使用其中的 stat 返回的其他元数据。

Linux(和 Unix)也有 sparse files , hard links , device files , symbolic links ,匿名文件(例如仍然打开的 inode ,但文件系统中不再存在),fifo(7) -s,unix(7)套接字等...您可能需要处理它们(但它们在 Windows 上没有完全相同的东西)。

另请阅读Operating Systems: Three Easy Pieces

您可能会使用多平台框架,如 PocoBoostQt 。他们试图提供一些常见的abstraction高于几个操作系统(但有些细节仍然很重要,并且难以隐藏或抽象;例如,文件 path 在 Windows 和 Linux 上是不同的。请参阅 path_resolution(7) ...)

您应该在编译时包含所有警告和调试信息(因此 gcc -Wall -Wextra -g 带有 GCC )。然后use the gdb debugger 。您也可以使用strace(1)了解system calls由您的程序完成。

关于linux - Linux下C语言如何获取文件长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50119172/

相关文章:

java - 如何将文本输出写入文件?

java - 如何在特定位置开始读取文件?

linux - 什么系列的数字可以用于新驱动程序中添加的新 ioctl

Python:内置键盘信号/中断

linux - Plesk 登录页面错误 : Uncaught Error: Class 'Form_View' not found in/opt/psa/admin/plib/PleskException. php:69

linux - 读/写阻塞的系统调用是否会将进程置于 TASK_UNINTERRUPTIBLE 或 TASK_INTERRUPTIBLE 状态?

Android:将字符串写入文件

Haskell "do nothing"IO,或者如果没有 else

python - "TypeError: a bytes-like object is required, not ' str '"在Python 3中处理文件内容时

file - 具有此类数据的文件的格式或编码是什么?