Как обнаружить ошибку полного диска и позволить программе возобновить работу после получения свободного места на диске


Я пишу приложение для запуска на LINUX, которое записывает на диск с помощью fprintf & fwrite. Я хотел бы иметь возможность ловить ошибки" disk full", предлагать пользователю сделать больше места, а затем возобновить работу, как будто ничего не произошло. Есть ли для этого какое-то изящное решение?

3 4

3 ответа:

Вы можете зарезервировать место в больших блоках (скажем, 64 кб или 1 МБ) и использовать пользовательские оболочки для fwrite и fprintf, чтобы убедиться, что данные записываются только в уже зарезервированную область. Эти обертки также выделят новое дисковое пространство для ваших файлов по мере необходимости. Тогда у вас будет всего несколько точек в коде, где" не хватает места на диске " на самом деле может произойти, и эта ошибка относительно легко восстанавливается, если вы знаете, что вы только выделяли.

Проверьте возвращаемое значение каждого вызова на fprintf() и fwrite(). Если любой из вызовов возвращает отрицательное значение, проверьте errno, чтобы увидеть, равен ли errno EDQUOT или ENOSPC, см. manpage для write (или в случае fprintf(), возможно, даже ENOMEM, как указано в некоторых manpages для fprintf, но не во всех). Если да, то у вас, вероятно, не хватает места на диске.

Что касается возобновления операции, как будто ничего не произошло; это немного сложнее; вам нужно будет отслеживать, какие данные вы успешно записали данные на диск, так что после того, как вы уведомили пользователя и он указал, что пришло время повторить попытку, вы можете возобновить запись этих данных с того момента, когда произошла ошибка. Это означает сохранение состояния записи в какой-либо структуре (то есть не только в стеке), чтобы вы могли вернуться из своей функции записи и затем возобновить ее позже. (Либо это, либо сделайте запись в отдельном потоке, и пусть поток уведомит основной поток, а затем заблокирует до тех пор, пока основной поток не уведомит о том, что продолжение безопасно... это может быть немного сложно, хотя)

Если вы можете использовать библиотеку boost, то это довольно просто.

Boost:: filesystem:: space возвращает информацию о дисковом пространстве. Метод Input to space-это путь к файлу, а результатом является структура space_info, которая содержит емкость, свободное пространство и доступное пространство. Подробнее о space_info - здесь .