gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:49 24 4
gpt4 key购买 nike

我正在寻找与 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com