我正在制作一个小程序,如下所示:
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 filen");
return;
}
int fseek_ret = fseek(fp, amount, SEEK_SET);
if(fseek_ret != 0)
{
printf("could not seek to the desired positionn");
fclose(fp);
return;
}
char garbage = 1;
size_t ret = fwrite(&garbage, 1, 1, fp);
if(ret != 1)
{
printf("could not write the garbage charactern");
}
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*/);
,它会输出一个创建的文件,其大小恰好为256MB。但是,如果我调用reserve_file_space("C:\Users\SysPart\Desktop\test.bin", 1 << 30 /*1 GB*/);
,它将生成大小为0的输出文件,并且不会打印出任何错误通知。
如何了解磁盘空间是否足以正确处理?
如何了解磁盘空间是否足以正确处理?
标准库对此没有任何函数。向前查找(就像您所做的那样)并不一定会失败,因为文件系统可以自由地延迟磁盘空间的实际分配,直到实际需要该空间(因为您正在向其中写入数据)。你只写一个字符,所以在这一点上只需要一个字符的空间(和一些元信息)。
为了真正确保您有足够的空间(即使考虑到检查后可能占用空间的其他进程),您必须写入所需大小的随机数据,然后用实际数据覆盖这些数据——这不是一种有效的方法。
标准做法是只尝试写入(不进行预分配),并检查写入操作是否成功。这也避免了进程终止,留下一些"预先保留"但无用的文件。
要事先检查可用磁盘空间,您必须依赖特定于操作系统的功能。
对于POSIX系统,有statvfs()。
对于WinAPI,有GetDiskFreeSpace()。