проверить наличие поврежденных секторов на жестком диске

Недавно, после пары отключений электроэнергии, мой компьютер сильно испортился (то и дело появляются BSODы, вся ОС ведет себя очень странно).

Теперь у меня есть программа, которая прекрасно работала до того, как мой компьютер сломался. Эта программа просто создает файл, используя CreateFile и записывает в него с помощью WriteFile. В этой программе также есть другие вещи, которые делают свое дело на основе этого файла. Я заметил, что вся программа тоже вела себя странно.

Мои результаты отладки:

  • Я заметил, что после CreateFile файл создается там, где он должен быть (проверено с помощью проводника и командной строки).
  • WriteFile не писал в файл (опять же проверил с помощью проводника и командной строки).
  • После WriteFile всякий раз, когда я дважды щелкал файл в проводнике или делал что-либо с этим файлом, все вело себя так, как будто файл не существует.
  • Все API вернули соответствующие коды успеха. Нет ошибки абсолютно.
  • После того, как я остановил свою программу и вышел из IDE, я пошел в проводник и попытался удалить папку, содержащую файл, созданный выше, он показал мне это:

    Ошибка при попытке удалить папку

  • Однако файл был удален.

Примечание. Вышеописанное происходит не всегда.

Благодаря вышеописанной отладке я пришел к выводу, что благодаря тому, что вся моя ОС ведёт себя странно, моя программа тоже ведёт себя странно. В моей программе нет ошибок (поскольку до этих проклятых отключений электроэнергии все работало идеально).

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

Мой вопрос: есть ли способ программно проверить, в порядке ли жесткий диск на C? Это обнаружение не обязательно должно быть на 100% правильным. Однако я хочу, чтобы эта проверка была довольно быстрой (поскольку я делаю много операций записи и тому подобное).

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


person Anish Ramaswamy    schedule 28.03.2013    source источник
comment
comment
@NPE, Есть ли способ программно проверить, исправен ли жесткий диск в C?   -  person Anish Ramaswamy    schedule 28.03.2013
comment
если ваша программа не является какой-то утилитой, которая должна знать о такой проблеме, было бы очень странно предлагать пользователям проверить свой диск на наличие ошибок   -  person msam    schedule 28.03.2013
comment
@msam, это сообщение всего лишь возможность. Но я определенно не хочу, чтобы моя программа продолжала работать, если узнает о таком состоянии.   -  person Anish Ramaswamy    schedule 28.03.2013
comment
Попробуйте, может быть, открыть файл, используя флаг FILE_FLAG_NO_BUFFERING, чтобы записи сразу же сбрасывались на диск и не проходили через дисковый кеш... так что, возможно, вы можете увидеть какую-то ошибку в кодах возврата WriteFile. Однако это также снижает производительность.   -  person Ale    schedule 28.03.2013
comment
Вы пытались создать файл в другом месте. Например: создайте файл вручную в каком-либо месте, напишите в него и затем удалите. Теперь снова попробуйте то же самое программно. Что вы получаете?   -  person Abhineet    schedule 28.03.2013
comment
@Abhineet, хорошо, я создал файл .txt в том же каталоге. Я открыл его и написал какой-то случайный текст, сохранил его и закрыл. Затем я удалил каталог, и это сработало! Теперь моя программа работает нормально (пока).   -  person Anish Ramaswamy    schedule 28.03.2013
comment
@NPE, почему минус? :(   -  person Anish Ramaswamy    schedule 28.03.2013


Ответы (2)


Возможно, вам лучше просмотреть уведомления S.M.A.R.T перед сбоем через API, который позволяет заблаговременно предупреждать о проблемах с диском до их возникновения. Вот я быстро нашел одну реализацию, которая выглядит для вашей платформы, но я не проверял.

Подозреваю, что есть и лучше. Основное преимущество этого SMART-подхода заключается в обнаружении проблем до того, как они станут важными. Тем не менее, многие операционные системы имеют встроенную функциональность, редко можно сделать это на уровне приложения чем-то другим, кроме дисковой утилиты.

person Randy Howard    schedule 28.03.2013

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

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

person Deanna    schedule 28.03.2013