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

时间:2016-07-27 02:18:06

标签: 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;
}

我的电脑上的可用磁盘空间大约为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的输出文件,而不会打印出任何错误通知。

如何知道磁盘空间是否足以正确处理?

1 个答案:

答案 0 :(得分:2)

  

如果磁盘空间足以正确处理,我该如何学习?

标准库没有此功能。寻求前进(就像你做的那样)并不能保证失败,因为文件系统可以自由地延迟实际分配磁盘空间,直到实际需要该空间为止(因为你正在向它写入数据)。你只写一个字符,所以此时实际上只需要那个字符的空间(以及一些元信息)。

要确定您有足够的空间(即使在考虑其他可能占用空间的进程后),您还必须编写所需大小的随机数据,然后用实际数据覆盖 - 不是一种有效的做事方式。

标准做法是尝试写入(不预先分配),并检查写入操作是否成功。这也避免了流程终止,留下了一些预先保留的&#34;但是周围没有无用的文件。

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

对于POSIX系统,有statvfs()

对于WinAPI,有GetDiskFreeSpace()