如何不使用stdio库获取文件大小?现有stdio方案需替代
不依赖stdio库获取文件大小的实现方案
嘿,我明白你想摆脱对stdio库的依赖来获取文件大小的需求——这其实完全可以通过直接调用操作系统提供的系统调用来实现,不同平台的具体做法略有不同,我给你分别拆解:
Linux/Unix 类系统(包括 macOS)
在这类系统下,你有两种常用的方式:
方式1:使用 lseek 系统调用
通过打开文件后,将文件偏移量移动到末尾,返回的偏移值就是文件大小。需要用到 <unistd.h> 和 <fcntl.h> 头文件:
#include <unistd.h> #include <fcntl.h> #include <errno.h> off_t get_file_size(const char* filename) { int fd = open(filename, O_RDONLY); if (fd == -1) { // 处理打开失败的情况,比如打印错误信息 return -1; } off_t size = lseek(fd, 0, SEEK_END); // 如果需要保持文件指针在开头,可以再加一句 lseek(fd, 0, SEEK_SET); close(fd); return size; // 失败时返回-1,可通过errno查看具体错误 }
方式2:使用 stat 系统调用
这种方式不需要打开文件,直接通过文件名获取文件元数据,其中就包含文件大小。需要用到 <sys/stat.h> 头文件:
#include <sys/stat.h> off_t get_file_size(const char* filename) { struct stat file_stat; if (stat(filename, &file_stat) == -1) { // 处理获取元数据失败的情况 return -1; } return file_stat.st_size; }
Windows 系统
Windows下可以通过Win32 API直接操作文件句柄来获取大小,需要用到 <windows.h> 头文件:
#include <windows.h> DWORD get_file_size(const char* filename) { HANDLE hFile = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { // 处理打开失败的情况,可调用GetLastError()获取错误码 return 0; } DWORD fileSize = GetFileSize(hFile, NULL); CloseHandle(hFile); return fileSize; // 如果文件大小超过4GB,建议使用GetFileSizeEx获取更大的数值类型 }
注意事项
- 不管哪种方式,都要做好错误处理:比如文件不存在、权限不足等情况都会导致调用失败,要检查返回值并处理。
- 对于超大文件(比如超过2GB的32位系统、超过4GB的64位系统),要注意使用合适的数据类型(比如Linux下的
off_t,Windows下的LARGE_INTEGER)。 - 这些实现完全绕过了stdio库的封装,直接和操作系统内核交互,完全符合你的需求。
内容的提问来源于stack exchange,提问作者P.George
相关产品推荐
相关产品推荐

