我正在编写一个在 LINUX 上运行的应用程序,它使用 fprintf 和 fwrite 写入磁盘。我希望能够捕获“磁盘已满”错误,提示用户腾出更多空间,然后像什么都没发生一样恢复操作。有什么优雅的解决方案吗?
3 回答
检查每次调用fprintf()
和的返回值fwrite()
。如果任一调用返回负值,请检查errno
是否errno
等于EDQUOT
or ENOSPC
,请参阅manpage 以进行 write(或者如果是fprintf()
even ENOMEM
,如fprintf 的某些联机帮助页中所述,但并非全部)。如果是这样,您可能磁盘空间不足。
至于像什么都没发生一样恢复运营;这有点难;您需要跟踪您成功写入磁盘的数据,以便在您通知用户并且他们表示该重试之后,您可以从发生了错误。这意味着将写入状态保持在某种结构中(即不仅仅是在堆栈上),以便您可以从写入功能返回,然后稍后恢复它。(要么这样,要么在单独的线程中进行写入,并让线程通知主线程然后阻塞,直到主线程通知回来可以安全继续......但这可能会有点棘手)
您可以以更大的块(例如,64kB 或 1MB)保留空间,并使用自定义包装器fwrite
来fprintf
确保数据仅写入已保留的区域。这些包装器还会根据需要为您的文件分配新的磁盘空间。然后,您的代码中只有几个点实际上可能发生“磁盘空间不足”,如果您知道自己只是在分配,则该错误相对容易恢复。
如果您能够使用boost库,那么非常简单。
boost::filesystem::space返回有关磁盘空间的信息。space方法的输入是文件的路径,结果是space_info结构,它包含容量、可用空间和可用空间。更多关于 space_info 的信息在这里。