...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
среда, 11 февраля 2009 г.
Это только временно
У NT есть множество классных возможностей, которые далеко не очевидны, если только вы не читаете документацию ДЕЙСТВИТЕЛЬНО внимательно.
Одна из моих любимых - то, что я называю “временные” временные файлы.
“Временный” временный файл - это такой файл, содержимое которого никогда не сбрасывается на диск (при отсутствии нехваток памяти, конечно же). Он ведёт себя точно как файл (потому что это и есть файл), но менеджер кэша отключает отложенную запись файла, а файловая система в курсе, что страницы, содержащие метаданные файла, никогда не нужно сбрасывать на диск.
Чтобы создать “временный” файл, вы должны вызвать CreateFile, указывая в параметре dwFlagsAndAttributes комбинацию FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE. Эта комбинация битов работает как подсказка файловой системе, что данные файла никогда не должны сбрасываться на диск. Другими словами, такой файл может быть создан, в него могут писаться данные, из него можно читать, а система при этом ни разу даже не коснётся диска.
Зачем кому-то может понадобиться такой файл?
Ну, рассмотрите сценарий web-сервера, который создаёт контент для клиентских приложений. В этом случае возможно, что на полпути рендеринга контента, отправляемого клиенту, вы столкнётесь с ошибкой. Проблема в том, что вы уже отправили ответ 200 OK клиенту, поэтому клиент считает, что ошибок нет. Для исправления этой ситуации, вы можете рендерить контент во “временный” временный файл, и если при этом у вас возникнет ошибка - вы сможете среагировать и отправить клиенту подходящий код ошибки. Если же рендеринг пройдёт успешно, вы можете использовать TransmitFile (если ваш сервер написан на raw-сокетах) или HttpSendHttpResponse (если ваш сервер написан на HTTP API) для отправки данных ответа напрямую из файла.
Есть много других причин для использования этого механизма. Например, POP, IMAP и NNTP сервера в Exchange 5.5 используют эту технику для рендеринга контента сообщений RFC822. Сервер Exchange рендерит e-mail сообщение во временный файл, а затем использует TransmitFile для отправки ответа клиенту. Мы использовали этот механизм по двум причинам – мы хотели обрабатывать упоминаемые выше сценарии с ошибками, а также мы хотели уметь обращаться с потенциально большими e-mail сообщениями.
Видите ли, другим большим плюсом “временных” временных файлов по сравнению с буферами в памяти является то, что их размер ограничен доступным свободным местом на диске, а НЕ в памяти. Поэтому, если рендеринг в памяти может обломаться с данными в 1 Гб (потому что вы не смогли выделить непрерывный кусок памяти в 1 Гб), то у рендеринга во “временный” временный файл таких проблем нет (в предположении, что у вас есть свободное дисковое пространство). Если у вас закончится память - менеджер памяти будет сбрасывать ваш файл на диск. Конечно же, это повлияет на производительность, но, по-крайней мере, ваша операция будет успешна.
2 комментария:
Можно использовать некоторые HTML-теги, например:
<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>
Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.
Можно ли как-то писать в такой файл в середину, переписывая символы, как если бы была нажата кнопка INS на клаве? Если да, что навряд ли, как обычно, то что будет в случае файла с многобайтной кодировкой символов переменной длины? - есть ли для этого специальный символ-заполнитель, затыкающий в файле полустёртые символы?
ОтветитьУдалитьКакой "такой"? Это же обычный файл. Можно ли писать в середину файлы с перезаписью? Можно, конечно. В чём проблема-то?
Удалить