Как справиться с сценариями "полный диск"?

Подавляющее большинство приложений не обрабатывают сценарии "полный диск" должным образом.

Пример: установщик не видит, что диск заполнен, игнорирует все ошибки и, наконец, с радостью объявляет "установка завершена!", или программа электронной почты не знает, что сообщение, которое оно только что загрузило, не удалось сохранить, и сообщает серверу об удалении оригинала.

Какие методы должны обрабатывать эту ситуацию изящно? Вы используете их? Вы проверяете их?

Ответ 1

Как пользователь, я хочу, чтобы программное обеспечение:

  • Сохраните мои данные.
  • Подтвердите мою среду как можно раньше, прежде чем я выполню настоящую работу.
  • Если #2 невозможно, расскажите мне о каких-либо особых требованиях.
  • Очистите себя.

Как разработчик, методы для этого включают:

  • Отменить только, когда нет альтернативы, и разрешить пользователю сделать новый выбор, если предыдущий не удался (см. ответ AgentThirteen).
  • Проверка необходимых ресурсов (памяти, дискового пространства, периферийных устройств) как можно раньше. Остановитесь немедленно, если сбой определен; отображать предупреждение, если успех неизвестен, что позволяет пользователю выбирать, продолжать ли.
  • Предварительное выделение ресурсов для обеспечения того, чтобы они все еще были доступны, когда они необходимы.
  • Отображение предупреждений и ошибок в немодальных диалогах, чтобы пользователь мог разместить приложение в фоновом режиме и использовать другие инструменты для устранения проблемы.
  • Поддержание списка "отменить": история действий, которые были выполнены до сих пор. Если приложение должно быть прервано, предложите возможность отменить эти действия.

Ответ 2

Я проверяю наличие ошибок при открытии, записи или закрытии файла. С другой стороны, я не делаю ничего, в частности, для обработки ошибок "полного диска". Вместо этого я полагаюсь на базовую ОС, чтобы сообщать об этих ошибках мне так же, как она сообщает о любых других типах ошибок.

Ответ 3

Я работаю с программным обеспечением для сбора данных. Поскольку я могу оценить размер файла, прежде чем я его создам (исходя из объема данных, которые требуется получить), я предупреждаю даже до того, как я создам файл в зависимости от того, сколько дискового пространства существует, если я ожидаю, что у меня закончится комната.

Ответ 4

Важно структурировать ваши подпрограммы устойчивости внутри цикла, который зацикливается, предлагая пользователю выбрать местоположение, а затем попытаться сохранить, пока данные не сохранятся правильно или пользователь не захочет отменить. Мне кажется очевидным, но я видел множество приложений, которые попадают в исключение, когда вы пытаетесь упорствовать в том, что даже не обрабатываются, а вытесняют выполнение из вашей программы и теряют ваши данные в памяти.

Ответ 5

Как это часто бывает, моя позиция по этому вопросу противоречит традиционному мышлению.

В общем, я игнорирую внедисковое пространство так же, как игнорирую память. Отчасти потому, что невозможно надежно предсказать эти условия. Отчасти потому, что, когда мы говорим о поведении программного обеспечения в неожиданных условиях (например, ошибка, которую вы не знаете, у вас есть, что заставляет вас есть весь диск или память), невозможно правильно рассуждать о ситуации, чтобы закодировать ее И ИСПЫТАТЬ ЭТО. (Можно с уверенностью предположить, что если у вас есть код, который не протестирован, он не работает).

Однако существуют особые условия, которые указывают на другой подход:

  • Если вы сохраняете важные, несохраненные, пользовательские состояния (например, текстовый файл с некоторыми изменениями), подумайте о предварительном сохранении данных в фоновом режиме, чтобы впоследствии авария была восстановлена.

    /li >
  • Если вы собираетесь записывать на диск на основе интерактивной пользовательской команды (например, File- > Save), вы можете поймать сбой и предложить, чтобы они снова попробовали.

В обоих случаях важно, чтобы ошибки выглядели как ошибки. Сбой ошибок должен быть аварийным. Захватывая неожиданные исключения и продолжая спокойно обманывать вас диагностическими возможностями, оставляя ваше программное обеспечение в небезопасном состоянии.

Ответ 6

Для тестирования создайте небольшие разделы, которые будут выходить из пространства в разных точках, возможно, в качестве виртуальных ПК, чтобы тесты были хорошо и воспроизводимыми.

Ответ 7

Чтобы расширить это, существуют ли методы обработки "полного диска" на SQL-сервере? Никогда не бывало, я знаю, но может (и со мной случилось).

Я знаком с тестированием на диске, полным на автономных приложениях для ПК (с ростом программирования в эпоху гибких дисков). Даже в более старой системе SCO Unix, которая была очень плотной в пространстве и замерзала, если вы выбежали из космоса. Не так хорошо знакомы с тем, что это означает в современной системе.

Ответ 8

Вы совершенно правы. Программное обеспечение должно корректно обрабатывать такую ​​ситуацию.

Вы всегда можете проверить IOException, чтобы узнать, заполнен ли диск или у пользователя есть права на запись в это место.

SQL Server справляется с этой ситуацией, но не восстанавливается. Когда диск заполнен, он перестает работать.:)

Ответ 9

Мы просто добавили поддержку для этого в наш продукт. Находясь на встроенном устройстве, мы проверяем дисковое пространство ниже 20% (10 МБ) каждый час и передаем предупреждения на офисный сервер, регистрируем проблему и предупреждаем пользователя.

Как только в этом состоянии мы проверяем каждые две минуты пространство под 2 МБ и изящно останавливаем приложение (систему наведения) и отказываемся работать до тех пор, пока проблема пространства не будет решена.

Поскольку наш продукт является базовой системой на рабочем месте наших клиентов, это привлекает внимание администраторов.

Ответ 10

Если я пишу приложение, я могу его каким-то образом восстановить из-за сбоя ввода-вывода, но если я запускаю приложение для другого пользователя, я должен принять другой подход, который должен восстановить столько дисков насколько это возможно. Это метод, который я использую. Могут быть большие объемы восстанавливаемого дискового пространства в виде 1) небольшого количества больших файлов, скрытых глубоко в неясных каталогах, или 2) большое количество небольших файлов, распределенных по диску, снова в неочевидных местах. Этот метод находит их в любом случае.

Ответ 11

Да, это, наверное, очень плохая идея, чтобы попытаться сделать что-то "умное" в этой проблеме. В основном больше всего вы можете попытаться минимизировать потерю. Для интерактивных приложений с несохраненными пользовательскими данными попробуйте избежать сбоев, прежде чем у пользователя появится возможность решить проблему.