Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测磁盘已满错误并在获得可用磁盘空间后让程序恢复_C++_C_Linux_Filesystems - Fatal编程技术网

C++ 如何检测磁盘已满错误并在获得可用磁盘空间后让程序恢复

C++ 如何检测磁盘已满错误并在获得可用磁盘空间后让程序恢复,c++,c,linux,filesystems,C++,C,Linux,Filesystems,我正在编写一个在LINUX上运行的应用程序,它使用fprintf&fwrite将数据写入磁盘。我希望能够捕获“磁盘已满”错误,提示用户释放更多空间,然后恢复操作,就好像什么都没发生一样。是否有合适的解决方案?检查对fprintf()和fwrite()的每次调用的返回值。如果任一调用返回负值,请检查errno以查看errno是否等于EDQUOT或ENOSPC,请参阅(或者如果是fprintf()甚至可能是ENOMEM,如中所述,但不是)。如果是这样,可能是磁盘空间不足 至于像什么都没发生一样恢复行

我正在编写一个在LINUX上运行的应用程序,它使用fprintf&fwrite将数据写入磁盘。我希望能够捕获“磁盘已满”错误,提示用户释放更多空间,然后恢复操作,就好像什么都没发生一样。是否有合适的解决方案?

检查对
fprintf()
fwrite()
的每次调用的返回值。如果任一调用返回负值,请检查
errno
以查看
errno
是否等于
EDQUOT
ENOSPC
,请参阅(或者如果是
fprintf()
甚至可能是
ENOMEM
,如中所述,但不是)。如果是这样,可能是磁盘空间不足

至于像什么都没发生一样恢复行动,;这有点难;您需要跟踪已成功写入磁盘的数据,以便在您通知用户并且用户指示该重试时,您可以从错误发生时开始继续写入该数据。这意味着将写操作的状态保持在某种类型的结构中(即,不只是在堆栈上),以便您可以从写操作函数返回,然后在以后继续它。(要么这样,要么在单独的线程中写入,让线程通知主线程,然后阻塞,直到主线程通知返回可以安全继续…这可能会有点棘手)

如果您能够使用库,那么这是非常简单的


返回有关磁盘空间的信息。space方法的输入是文件的路径,结果是包含容量、可用空间和可用空间的space\u info结构。有关空间信息的更多信息是。

您可以将空间保留在较大的块中(例如64kB或1MB),并使用自定义包装器对
fwrite
fprintf
进行包装,以确保数据仅写入已保留的区域。这些包装器还会根据需要为文件分配新的磁盘空间。然后,您的代码中只有几个点实际上可能发生“磁盘空间不足”的情况,如果您知道自己只进行了分配,则此错误相对容易恢复。

fclose()也是,不是吗?我似乎记得fwrite()可能会成功,但实际上它只写入内部缓冲区。实际上只有fclose()写入所有内容,然后检测到磁盘已满。@bortzmeyer是的,也是这样。。。虽然我不确定如何从fclose()返回的错误中干净地恢复,因为很难知道在错误发生之前写入了多少数据!也许通过检查写入文件的长度。。。或者,通过调用write()而不是fwrite()或fprintf(),完全避免使用C缓冲机制可能更容易。这是给你的disk@WumpusQ.Wumbley我按“男人fprintf”说的去做,它会回来的。。。“[ENOMEM]==可用存储空间不足”@tianya You write,缓冲层可能有问题。正如我在上面的评论中所说,您可以通过直接调用write()来避免缓冲层。错误的算法:在多用户机器上,在您调用boost::filesystem::space和您写入的那一刻之间,磁盘可以由另一个进程填充。检查磁盘状态是否不是瓶颈,在我的应用程序运行的同时,磁盘可能被其他处理器或用户使用。然后,虽然我们发现开始写入时空间足够,但应用程序也可能遇到磁盘不足的问题。我提出了一个相反的论点,您可以检查磁盘空间是否足够。这提供了一个三向选项:“空间太大,在写操作发生时磁盘不太可能已满”、“空间足够,但即将关闭;警告用户小心”和“空间绝对不够”。
C
C++
?这不一样,答案也不一样。从本质上说,不是。在99%的家庭“磁盘已满”异常中,你都很笨拙。你可能希望使用无缓冲
write()
而不是缓冲
fwrite()
fprintf()
将被
sprintf()
的组合所取代,然后是
write()
@tianya:实际上,更简单的是:如果您事先知道目标文件的大小,您可以预分配整个空间。例如,Windows资源管理器和一些下载管理器就是这样做的。