Потоки
С самой первой версии NTFS позволяла одному файлу иметь несколько потоков. К сожалению, этот весьма удобный механизм использовался очень слабо, хотя применение потоков позволяет изящно решать многие проблемы.
Например, вы создаете файл. Для него необходимо сформировать и сохранить эскиз (уменьшенное изображение содержимого файла, предназначенное для предварительного просмотра) (thumbnail), который, как правило, записывается в конец файла. Для вывода эскиза надо открыть файл, считать информацию заголовка, найти начало нужной вам информации и только после этого считать данные. Можно хранить эскиз в отдельном файле, но в этом случае велика вероятность того, что сам файл будет перенесен в другое место без соответствующего ему эскиза.
Подобную проблему можно решить с использованием нескольких потоков. При создании файла основные данные следует записать в неименованный поток. Затем необходимо создать внутри того же файла именованный поток, предназначенный для данных образа. Теперь один файл будет содержать два потока.
Проведем следующий эксперимент. На машине Windows Server 2003 откроем окно командной строки. Перейдем в раздел NTFS (например, в папку, содержащую системные шрифты) и введем следующую команду (не делайте лишних пробелов!):
С:\WINDOWS\Fonts>dir>New_Stream.TXT:New_Stream
В результате выполнения этой команды система создаст файл New_Stream.TXT. Он будет содержать два потока: неименованный, в котором находится 0 байт, и именованный (с именем New_Stream), где будет находиться результат выполнения команды dir. Доступ к именованному потоку можно получить, обратившись к нему по имени через двоеточие после имени файла. В именах потоков, как и в именах файлов, имеет значение регистр символов.
К сожалению, многие утилиты, входящие в состав Windows Server 2003, не могут работать с именованными потоками. Рассмотрим, к примеру, следующую команду:
C:\WINDOWS\Fonts>dir New_Stream.TXT Volume in drive C is WinSrv2003 Volume Serial Number is 10D5-4C68 Directory of C:\WINDOWS\Fonts 16.04.2003 18:56 0 New_Stream.TXT 0 New_Stream.TXT 1 File(s) 0 bytes 0 bytes 0 Dir(s) 555 720 704 bytes free
Очевидно, что команда dir не видит именованный поток, поэтому она показывает, что размер файла New_Stream.TXT равен 0. Однако это не так: dir показывает только неименованный поток, размер именованного потока пользователю не показывается.
Проведем еще один эксперимент, выполним команду:
C:\WINDOWS\Fonts>dir< New_Stream.TXT:New_Stream Volume in drive С is WinSrv2003 Volume Serial Number is 10D5-4C68 Directory of C:\WINDOWS\Fonts File Not Found
Никакой информации не выводится. Из этого эксперимента видно, что команда dir не обладает средствами обращения к именованным потокам. Для просмотра содержимого именованного потока выполните следующую команду:
C:\WINDOWS\Fonts>more < New_Stream.TXT:New_Stream Volume in drive С is WinSrv2003 Volume Serial Number is 10D5-4C68 Directory of C:\WINDOWS\Fonts 25.03.2003 16:00 311 636 arial.ttf 25.03.2003 16:00 288 496 arialbd.ttf 25.03.2003 16:00 226 748 arialbi.ttf 25.03.2003 16:00 207 808 ariali.ttf 25.03.2003 16:00 117 028 ariblk.ttf 25.03.2003 16:00 127 596 comic.ttf
Теперь мы видим содержимое (оглавление) выбранной папки, которое было сохранено в именованном потоке с помощью команды dir>New_Stream.TXT:New_Stream.
Существует еще одно применение потоков. Предположим, что вы разрабатываете текстовый процессор. Корректируя файл, вы наверняка создадите временный файл, запишете туда все изменения, затем, когда наступит момент сохранить их, уничтожите оригинальный файл, его имя присвоите временному файлу и перенесете этот файл туда, где был расположен оригинальный файл. Весь процесс выглядит довольно просто. Однако следует помнить о том, что новый файл должен иметь то же время создания (time stamp creation), что и оригинальный файл. Кроме того, новый файл должен обладать теми же атрибутами, что и оригинальный файл. При сохранении изменений очень легко изменить один из атрибутов.
При использовании потоков все эти проблемы легко разрешаются. Все потоки в пределах одного файла имеют одни и те же атрибуты (время создания, безопасность и т. д.). Можно записывать изменения не во временный файл, а в именованный поток. Затем, при записи изменений достаточно переименовать именованный поток в неименованный, после чего с помощью средств NTFS удалить старый неименованный поток. Переименование потока должно быть выполнено в соответствии с принципом "все или ничего" (в виде транзакции – либо выполняются все операции, либо все остается в исходном состоянии).
Следует отметить, что при копировании файла, содержащего потоки, в файловую систему, не поддерживающую их (например, FAT на гибком диске), скопированы будут только данные неименованного потока.