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

C++ 如何在C/C+中使用stdio文件操作时检测磁盘空间不足+;?,c++,c,file-io,fopen,fwrite,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_SE

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

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;
}
void reserve\u file\u space(字符*文件路径、大小\u数量)
{
FILE*fp=fopen(文件路径,“w+b”);
如果(!fp)
{
printf(“无法创建新文件\n”);
返回;
}
int fseek_ret=fseek(fp,amount,SEEK_SET);
如果(fseek_ret!=0)
{
printf(“无法搜索到所需位置\n”);
fclose(fp);
返回;
}
char垃圾=1;
size_t ret=fwrite(&garbage,1,1,fp);
如果(ret!=1)
{
printf(“无法写入垃圾字符\n”);
}
fclose(fp);
}
int main(int argc,char*argv[])
{
保留文件空间(“C:\\Users\\SysPart\\Desktop\\test.bin”,1
如何了解磁盘空间是否足以正确处理

标准库没有这方面的功能。向前搜索(像您那样)不一定会失败,因为文件系统可以随意延迟实际分配的磁盘空间,直到实际需要该空间为止(因为您正在向其中写入数据)。您只写入一个字符,因此只能为该字符分配空间(和一些元信息)在这一点上实际上是需要的

为了确保您有足够的空间(即使在考虑检查后可能占用空间的其他进程时),您必须写入所需大小的随机数据,然后用实际数据覆盖这些数据——这不是一种有效的方法

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

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

对于POSIX系统,存在以下问题


对于WinAPI,有。

首先要做的是检查
fseek
的返回值,甚至是我做的
fclose
@kaylum。在两次调用中,它们都返回了0。@kaylum检查fclose的返回值是有意义的。谢谢!但是像往常一样,检查是否有足够的空间,然后执行您的操作会创建一个race co说明在您访问之前,其他程序可能已经使用了可用空间。有关如何在不必写入文件的情况下预分配空间的windows解决方案,请参阅。@RedX:我提到了竞争条件,并且还提到了为什么预分配可能不是最好的前进方式。抱歉,我错过了最重要的一步括号中的重要句子。我提供的链接指向一篇文章,该文章详细介绍了如何在windows下保留空间,而不必写入文件。我在第一篇评论中试图澄清这一点。POSIX statvfs将根据文件系统保留量给您一个粗略的猜测(例如,根保留是文件系统的一部分,但不反映保留的任何进一步的系统资源。如果需要剩余块/大小的确切数量,您也需要任何操作系统限制。@duong_dajgja:在您标记问题“C”时,我没有提到Boost).但是是的,对于操作系统特定的功能来说,这是一个方便的包装器…尽管有所有的缺点。