Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

Типы потоков

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

Тип потока Описание
::$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 и транзакционных NTFS (TxF). Пара ":StreamName:$StreamType" для EFS — ":$EFS:$LOGGED_UTILITY_STREAM", а для TxF — ":$TXF_DATA:$LOGGED_UTILITY_STREAM".
::$OBJECT_ID Идентификатор 16-байтов, используемый для идентификации файла для службы отслеживания ссылок.
::$REPARSE_POINT Данные точки повторного анализа.

 

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