gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:10 25 4
gpt4 key购买 nike

我正在做一个小程序如下:

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;
}

我 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 的输出文件,并且不会打印出任何错误通知。

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

最佳答案

How can I be learn if the disk space is sufficient to handle correctly?

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

要真正确保您有足够的空间(即使考虑到检查后可能占用空间的其他进程),您将不得不写入所需大小的随机数据,然后用您的实际数据覆盖它——不是一种有效的做事方式。

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

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

对于 POSIX 系统,有 statvfs() .

对于 WinAPI,有 GetDiskFreeSpace() .

关于c++ - 在C/C++中使用stdio文件操作时如何检测磁盘空间不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com