在C/C++中使用stdio文件操作时如何检测磁盘空间不足?

duo*_*gja 5 c c++ file-io fopen fwrite

我正在制作一个小程序如下:

void reserve_file_space(char* file_path, size_t amount)
{
    FILE* fp = fopen(file_path, "w+b");
    if(!fp)
    {
        printf("could not create a new file\n");
        return;
    }

    int fseek_ret = fseek(fp, amount, SEEK_SET);
    if(fseek_ret != 0)
    {
        printf("could not seek to the desired position\n");
        fclose(fp);
        return;
    }

    char garbage = 1;
    size_t ret = fwrite(&garbage, 1, 1, fp);
    if(ret != 1)
    {
        printf("could not write the garbage character\n");
    }

    fclose(fp);
}

int main(int argc, char* argv[])
{
    reserve_file_space("C:\\Users\\SysPart\\Desktop\\test.bin", 1 << 30);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的 PC 上的可用磁盘空间约为 500 MB。在main()如果我调用reserve_file_space("C:\\Users\\SysPart\\Desktop\\test.bin", 1 << 28 /*256 MB*/);输出与所256 MB确切大小创建的文件。但是,如果我调用reserve_file_space("C:\\Users\\SysPart\\Desktop\\test.bin", 1 << 30 /*1 GB*/);它会生成大小为 0 的输出文件,并且不会打印出任何错误通知。

如何了解磁盘空间是否足以正确处理?

Dev*_*lar 3

如何得知磁盘空间是否足够正确处理?

标准库没有这方面的函数。向前查找(就像您所做的那样)并不一定会失败,因为文件系统可以自由地延迟磁盘空间的实际分配,直到实际需要该空间为止(因为您正在向其中写入数据)。您只写一个字符,因此此时实际上只需要该一个字符(和一些元信息)的空间。

为了真正确保您有足够的空间(即使在检查后考虑可能占用空间的其他进程),您必须写入所需大小的随机数据,然后用实际数据覆盖它 - 这不是一个有效的做事方式。

标准做法是仅尝试写入(无需预分配),然后检查写入操作是否成功。这也避免了进程终止留下一些“预先保留”但无用的文件。

要事先检查可用磁盘空间,您必须依赖操作系统特定的功能。

对于 POSIX 系统,有statvfs()

对于 WinAPI,有GetDiskFreeSpace()