Потоки
С самой первой версии NTFS позволяла одному файлу иметь несколько потоков. К сожалению, этот весьма удобный механизм использовался очень слабо, хотя применение потоков позволяет изящно решать многие проблемы.
Например, вы создаете файл. Для него необходимо сформировать и сохранить эскиз (уменьшенное изображение содержимого файла, предназначенное для предварительного просмотра) (thumbnail), который, как правило, записывается в конец файла. Для вывода эскиза надо открыть файл, считать информацию заголовка, найти начало нужной вам информации и только после этого считать данные. Можно хранить эскиз в отдельном файле, но в этом случае велика вероятность того, что сам файл будет перенесен в другое место без соответствующего ему эскиза.
Подобную проблему можно решить с использованием нескольких потоков. При создании файла основные данные следует записать в неименованный поток. Затем необходимо создать внутри того же файла именованный поток, предназначенный для данных образа. Теперь один файл будет содержать два потока.
Проведем следующий эксперимент. На машине Windows 2000 откроем окно командной строки. Перейдем в раздел NTFS и введем следующую команду:
C:\fonts> DIR > New_Stream.TXT: New_Stream
В результате выполнения этой команды система создаст файл New_Stream.TXT. Он будет содержать два потока: неименованный, в котором находится 0 байт, и именованный (с именем New_Stream), где будет находиться результат выполнения команды dir. Доступ к именованному потоку можно получить, обратившись к нему по имени через двоеточие после имени файла. В именах потоков, как и в именах файлов, имеет значение регистр символов.
К сожалению, многие утилиты, входящие в состав Windows 2000, не могут работать с именованными потоками. Рассмотрим следующий пример:
C:\fonts> DIR New_Stream.TXT Volume in drive С is diskl Volume Serial Number is 5021-EFE6 Directory of C:\fonts 03/18/98 08:36a 0 New_Stream.TXT 1 File(s) 0 bytes 0 Dir(s) 170 968 064 bytes free
Очевидно, что команда dir не видит именованный поток, поэтому она показывает, что размер файла New_Stream.TXT равен 0. Однако это не так: dir показывает только неименованный поток. Размер именованного потока пользователю не показывается.
Проведем еще один эксперимент:
C:\fonts> DIR New_Stream.TXT:New_Stream Volume in drive С is diskl Volume Serial Number is 5021-EFE6 Directory of C:\fonts File not found
Из этого эксперимента видно, что команда dir не обладает средствами обращения к именованным потокам. Для просмотра содержимого именованного потока выполните следующую команду:
C:\fonts> MORE < New_Stream.TXT: Nfcw_Sream MTSORTS TTF 76 920 11.03.97 17:20 MTSORTS.TTF MARIGOLD TTF 101 448 09.05.97 9:12 MARIGOLD.TTF HPFONTS TER 648 868 09.06.97 14:02 HPFONTS.TER HP7UP DLL 58 176 30.07.97 14:28 HP7UP.DLL HPFONTS EDB 541 085 09.06.97 14:08 HPFONTS.EDB FONTSMRT HLP 22 552 03.04.97 15:18 FONTSMRT.HLP CORONET TTF 82 928 09.05.97 9:12 CORONET.TTF CORSIVA TTF 105 156 11.03.97 17:20 CORSIVA.TTF FONTSMRT EXE 817 984 30.07.97 14:30 FONTSMRT.EXE
Существует еще одно применение потоков. Предположим, что вы разрабатываете текстовый процессор. Корректируя файл, вы наверняка создадите временный файл, запишете туда все изменения, затем, когда наступит момент сохранить их, уничтожите оригинальный файл, его имя присвоите временному файлу и перенесете этот файл туда, где был расположен оригинальный файл. Весь процесс выглядит довольно просто. Однако следует помнить о том, что новый файл должен иметь то же время создания (time stamp creation), что и оригинальный файл. Кроме того, новый файл должен обладать теми же атрибутами, что и оригинальный файл. При сохранении изменений очень легко изменить один из атрибутов.
При использовании потоков все эти проблемы легко разрешаются. Все потоки в пределах одного файла имеют одни и те же атрибуты (время создания, безопасность и т. д.). Можно записывать изменения не во временный файл, а в именованный поток. Затем, при записи изменений достаточно переименовать именованный поток в неименованный, после чего с помощью средств NTFS удалить старый неименованный поток. Переименование потока должно быть выполнено в соответствии с принципом "все или ничего" (в виде транзакции – либо выполняются все операции, либо все остается в исходном состоянии).
Следует отметить, что при копировании файла, содержащего потоки, в файловую систему, не поддерживающую их (например, FAT на гибком диске), скопированы будут только данные неименованного потока.