четверг, 9 апреля 2009 г.

Удалён, но не забыт

Это перевод Deleted but not yet forgotten. Автор: Реймонд Чен.

Ранее я обсуждал взаимодействие различных флагов FILE_SHARE_*, потом Ларри Остерман вдохновился этим и написал историю этих флагов.

Если файл был открыт с разрешением на удаление, и вы удаляете файл, то файл на самом деле не пропадает из каталога, пока его дескриптор не будет закрыт. В это время файл болтается как зомби (zombie) (в Unix удалённый файл с открытыми дескрипторами удаляется из каталога и просто плавает в счастливом море безымянных inode-ов).

Почему же в Windows файл не исчезает?

Ну, первая причина: драйвер может запросить имя файла по открытому дескриптору (прим. пер.: а в Vista даже появилась аналогичная функция для приложений: GetFileInformationByHandleEx, даже для предыдущих версий Windows есть официальный путь получения имени: Obtaining a File Name From a File Handle). Если бы запись в каталоге была бы удалена, тогда не было бы никакого имени, которое можно было бы вернуть! (Что вы ожидали бы получить от GetModuleFileName, если модуль был бы удалён? Возможно ли для GetModuleFileName проваливаться с ошибкой ERROR_FILE_NOT_FOUND?)

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

И последняя причина: "ожидающий удаления" файл вовсе не исчезает безусловно. Драйвер может "анти-удалить" (undelete) файл, если он очистит флаг удалить-при-закрытии!

1 комментарий:

  1. Обсуждение особенностей FILE_SHARE_DELETE на DK:
    http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=69848

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.