在 C/C++ 中使用 stdio 文件操作时如何检测磁盘不足 space?
How to detect insufficient disk space when using stdio file operations in C/C++?
我正在做一个小程序如下:
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 上的可用磁盘 space 大约为 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 的输出文件,并且不会打印出任何错误通知。
如何了解磁盘 space 是否足以正确处理?
How can I be learn if the disk space is sufficient to handle correctly?
标准库没有这方面的功能。向前寻求(就像你所做的那样)并不保证会失败,因为文件系统可以自由延迟磁盘 space 的实际分配,直到真正需要 space 为止(因为你正在向它写入数据) .你只写了一个字符,所以此时只需要 space 这个字符(和一些元信息)。
为了真正确保您有足够的 space(即使在您检查后考虑其他可能占用 space 的进程),您将不得不写入所需大小的随机数据,然后用你的实际数据覆盖它——这不是一种有效的做事方式。
标准做法是只尝试写入(不进行预分配),并检查写入操作是否成功。这也避免了进程终止留下一些 "pre-reserved" 但无用的文件。
要事先检查可用磁盘 space,您必须依赖 OS 特定功能。
对于 POSIX 系统,有 statvfs()。
对于 WinAPI,有 GetDiskFreeSpace()。
我正在做一个小程序如下:
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 上的可用磁盘 space 大约为 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 的输出文件,并且不会打印出任何错误通知。
如何了解磁盘 space 是否足以正确处理?
How can I be learn if the disk space is sufficient to handle correctly?
标准库没有这方面的功能。向前寻求(就像你所做的那样)并不保证会失败,因为文件系统可以自由延迟磁盘 space 的实际分配,直到真正需要 space 为止(因为你正在向它写入数据) .你只写了一个字符,所以此时只需要 space 这个字符(和一些元信息)。
为了真正确保您有足够的 space(即使在您检查后考虑其他可能占用 space 的进程),您将不得不写入所需大小的随机数据,然后用你的实际数据覆盖它——这不是一种有效的做事方式。
标准做法是只尝试写入(不进行预分配),并检查写入操作是否成功。这也避免了进程终止留下一些 "pre-reserved" 但无用的文件。
要事先检查可用磁盘 space,您必须依赖 OS 特定功能。
对于 POSIX 系统,有 statvfs()。
对于 WinAPI,有 GetDiskFreeSpace()。