Как обнаружить ошибку полного диска и позволить программе возобновить работу после получения свободного места на диске
Я пишу приложение для запуска на LINUX, которое записывает на диск с помощью fprintf & fwrite. Я хотел бы иметь возможность ловить ошибки" disk full", предлагать пользователю сделать больше места, а затем возобновить работу, как будто ничего не произошло. Есть ли для этого какое-то изящное решение?
3 ответа:
Вы можете зарезервировать место в больших блоках (скажем, 64 кб или 1 МБ) и использовать пользовательские оболочки для
fwriteиfprintf, чтобы убедиться, что данные записываются только в уже зарезервированную область. Эти обертки также выделят новое дисковое пространство для ваших файлов по мере необходимости. Тогда у вас будет всего несколько точек в коде, где" не хватает места на диске " на самом деле может произойти, и эта ошибка относительно легко восстанавливается, если вы знаете, что вы только выделяли.
Проверьте возвращаемое значение каждого вызова на
fprintf()иfwrite(). Если любой из вызовов возвращает отрицательное значение, проверьтеerrno, чтобы увидеть, равен лиerrnoEDQUOTилиENOSPC, см. manpage для write (или в случаеfprintf(), возможно, дажеENOMEM, как указано в некоторых manpages для fprintf, но не во всех). Если да, то у вас, вероятно, не хватает места на диске.Что касается возобновления операции, как будто ничего не произошло; это немного сложнее; вам нужно будет отслеживать, какие данные вы успешно записали данные на диск, так что после того, как вы уведомили пользователя и он указал, что пришло время повторить попытку, вы можете возобновить запись этих данных с того момента, когда произошла ошибка. Это означает сохранение состояния записи в какой-либо структуре (то есть не только в стеке), чтобы вы могли вернуться из своей функции записи и затем возобновить ее позже. (Либо это, либо сделайте запись в отдельном потоке, и пусть поток уведомит основной поток, а затем заблокирует до тех пор, пока основной поток не уведомит о том, что продолжение безопасно... это может быть немного сложно, хотя)
Если вы можете использовать библиотеку boost, то это довольно просто.
Boost:: filesystem:: space возвращает информацию о дисковом пространстве. Метод Input to space-это путь к файлу, а результатом является структура space_info, которая содержит емкость, свободное пространство и доступное пространство. Подробнее о space_info - здесь .