我正在寻找与 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
您可能会使用多平台框架,如 Poco或Boost或Qt 。他们试图提供一些常见的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/