4

我正在编写一个在 LINUX 上运行的应用程序,它使用 fprintf 和 fwrite 写入磁盘。我希望能够捕获“磁盘已满”错误,提示用户腾出更多空间,然后像什么都没发生一样恢复操作。有什么优雅的解决方案吗?

4

3 回答 3

5

检查每次调用fprintf()和的返回值fwrite()。如果任一调用返回负值,请检查errno是否errno等于EDQUOTor ENOSPC,请参阅manpage 以进行 write(或者如果是fprintf()even ENOMEM,如fprintf 的某些联机帮助页中所述,但并非全部)。如果是这样,您可能磁盘空间不足。

至于像什么都没发生一样恢复运营;这有点难;您需要跟踪您成功写入磁盘的数据,以便在您通知用户并且他们表示该重试之后,您可以从发生了错误。这意味着将写入状态保持在某种结构中(即不仅仅是在堆栈上),以便您可以从写入功能返回,然后稍后恢复它。(要么这样,要么在单独的线程中进行写入,并让线程通知主线程然后阻塞,直到主线程通知回来可以安全继续......但这可能会有点棘手)

于 2013-06-15T21:33:34.593 回答
2

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

于 2013-06-15T22:32:03.573 回答
2

如果您能够使用boost库,那么非常简单。

boost::filesystem::space返回有关磁盘空间的信息。space方法的输入是文件的路径,结果是space_info结构,它包含容量、可用空间和可用空间。更多关于 space_info 的信息在这里

于 2013-06-15T21:35:55.013 回答