我正在制作一个小程序如下:
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的输出文件,而不会打印出任何错误通知。
如何知道磁盘空间是否足以正确处理?
答案 0 :(得分:2)
如果磁盘空间足以正确处理,我该如何学习?
标准库没有此功能。寻求前进(就像你做的那样)并不能保证失败,因为文件系统可以自由地延迟实际分配磁盘空间,直到实际需要该空间为止(因为你正在向它写入数据)。你只写一个字符,所以此时实际上只需要那个字符的空间(以及一些元信息)。
要确定您有足够的空间(即使在考虑其他可能占用空间的进程后),您还必须编写所需大小的随机数据,然后用实际数据覆盖 - 不是一种有效的做事方式。
标准做法是尝试写入(不预先分配),并检查写入操作是否成功。这也避免了流程终止,留下了一些预先保留的&#34;但是周围没有无用的文件。
要预先检查可用磁盘空间,您必须依赖特定于操作系统的功能。
对于POSIX系统,有statvfs()。
对于WinAPI,有GetDiskFreeSpace()。