Потоки файлов (локальные файловые системы)

Поток — это последовательность байтов. В файловой системе NTFS потоки содержат данные, записанные в файл, и предоставляют дополнительные сведения о файле, чем атрибуты и свойства. Например, можно создать поток, содержащий ключевое слово поиска, или удостоверение учетной записи пользователя, создающей файл.

Каждый поток, связанный с файлом, имеет собственный размер выделения, фактический размер и допустимую длину данных:

  • Размер выделения — это объем дискового пространства, зарезервированного для потока.
  • Фактический размер — это количество байтов, используемых вызывающим оператором.
  • Допустимая длина данных (VDL) — это количество байтов, инициализированных из размера выделения для потока.

Каждый поток также поддерживает собственное состояние для сжатия, шифрования и разреженности. Атрибут FILE_ATTRIBUTE_SPARSE_FILE файла задается в элементе dwFileAttributes структуры WIN32_FIND_DATA, возвращаемой из функций FindFirstFile, FindFirstFileEx и FindNextFile, если любой из потоков когда-либо был разрежен. GetFileAttributes, GetFileAttributesEx, GetFileAttributesTransacted, GetFileInformationByHandle и GetFileInformationByHandleEx возвращают разреженное состояние потока данных по умолчанию, если поток не указан.

С потоком нет времени, связанного с файлом. Время выполнения файла обновляется при обновлении любого потока в файле.

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

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

Соглашения об именовании для Потоки

При указании из командной строки оболочки Windows полное имя потока — filename:stream name:stream type, как в следующем примере: "myfile.dat:stream1:$DATA".

Все символы, которые являются законными для имени файла, также являются законными для имени потока, включая пробелы. Дополнительные сведения см. в разделе Именование файла. Тип потока (также называемый кодом типа атрибута) является внутренним для файловой системы NTFS. Поэтому пользователи не могут создавать новые типы потоков, но могут открывать существующие типы файловой системы NTFS. Значения описателя типов потока всегда начинаются с символа знака доллара ($). Ниже приведен список типов потоков.

По умолчанию поток данных по умолчанию не именуется. Чтобы полностью указать поток данных по умолчанию, используйте filename::$DATA, где $DATA является типом потока. Это эквивалент имени файла. Вы можете создать именованный поток в файле с помощью соглашений об именовании файлов. Обратите внимание, что "$DATA" — это юридическое имя потока. Например, полное имя потока с именем "$DATA" в файле с именем sample будет "sample:$DATA:$DATA". Если вы создали поток с именем bar в том же файле, то его полное имя будет "sample:bar:$DATA".

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

Типы потоков

Ниже приведен список типов потоков NTFS, которые также называются кодами типов атрибутов. Некоторые типы потоков являются внутренними для NTFS, а их формат не является незадокументированным.

Тип потока Description
::$ATTRIBUTE_LIST Содержит список всех атрибутов, составляющих файл, и определяет расположение каждого атрибута.
::$BITMAP Растровое изображение, используемое индексами для управления свободным пространством b-дерева для каталога. Дерево b управляется в 4 КБ блоках (независимо от размера кластера), и это используется для управления выделением этих блоков. Этот тип потока присутствует в каждом каталоге.
::$DATA Поток данных. Поток данных по умолчанию не имеет имени. Потоки данных можно перечислить с помощью функций FindFirstStreamW и FindNextStreamW.
::$EA Содержит данные расширенных атрибутов.
::$EA_INFORMATION Содержит сведения о поддержке расширенных атрибутов.
::$FILE_NAME Имя файла в символах Юникода. Это включает короткое имя файла, а также любые жесткие ссылки.
::$INDEX_ALLOCATION Тип потока каталога. Используется для реализации выделения имен файлов для больших каталогов. Этот поток представляет сам каталог и содержит все данные каталога. Изменения потоков этого типа записываются в журнал изменений NTFS. Имя потока по умолчанию типа потока $INDEX_ALLOCATION — $I 30, поэтому "DirName", "DirName::$INDEX_ALLOCATION" и "DirName:$I 30:$INDEX_ALLOCATION" эквивалентны.
::$INDEX_ROOT Этот поток представляет корень дерева b-индекса. Этот тип потока присутствует в каждом каталоге.
::$LOGGED_UTILITY_STREAM Аналогично ::$DATA, но операции регистрируются в журнал изменений NTFS. Используется EFS и Transactional NTFS (TxF). Пара ":StreamName:$StreamType" для EFS — ":$EFS:$LOGGED_UTILITY_STREAM" и для TxF — ":$TXF_DATA:$LOGGED_UTILITY_STREAM".
::$OBJECT_ID Идентификатор 16-байтов, используемый для идентификации файла для службы отслеживания ссылок.
::$REPARSE_POINT Данные точки повторного анализа.

 

Использование Потоки