You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:43:49