文件流(本地文件系统)

流是字节序列。 在 NTFS 文件系统中,流包含写入文件的数据,它提供了比特性和属性更多的关于文件的信息。 例如,可以创建包含搜索关键字的流,或者创建文件的用户帐户的标识。

与文件关联的每个流都有自己的分配大小、实际大小和有效数据长度:

  • 分配大小是为流保留的磁盘空间量。
  • 实际大小是调用方正在使用的字节数。
  • 有效数据长度 (VDL) 是根据流的分配大小初始化的字节数。

每个流还维护自己的压缩、加密和稀疏状态。 文件的 FILE_ATTRIBUTE_SPARSE_FILE 属性在从FindFirstFileFindFirstFileExFindNextFile 函数返回的 WIN32_FIND_DATA结构的 dwFileAttributes 成员中设置(如果任何流曾经是稀疏的)GetFileAttributesGetFileAttributesExGetFileAttributesTransactedGetFileInformationByHandleGetFileInformationByHandleEx 返回默认数据流的稀疏状态(如果未指定流)

没有与流关联的文件时间。 当文件中的任何流更新时,文件的文件时间也会更新。

每个流维护机会锁。 每个流还维护共享模式。 当请求对文件的删除访问权限时,操作系统会检查文件中所有打开的流的删除访问权限。 如果另一个进程在没有 FILE_SHARE_DELETE 权限的情况下打开了一个流,则你无法打开该文件进行删除访问

如果要复制的文件具有数据流,并且使用了网络重定向程序,则仅当客户端同时具有读取权限和读取属性权限时,才能复制该文件。

流的命名约定

从 Windows shell 命令行指定时,流的全名是“文件名:流名称:流类型”,如下例所示:“myfile.dat:stream1:$DATA”

对于文件名合法的任何字符对于流名称也是合法的,包括空格。 有关详细信息,请参阅命名文件。 流类型(也称为属性类型代码)在 NTFS 文件系统内部。 因此,用户无法创建新的流类型,但可以打开现有的 NTFS 文件系统类型。 流类型说明符值始终以美元符号 ($) 开头。 有关流类型的列表,请参阅下文。

默认情况下,默认数据流未命名。 要完全指定默认数据流,请使用“filename::$DATA”,其中 $DATA 是流类型。 这等效于“filename”。 你可以使用文件命名约定在文件中创建命名流。 请注意,“$DATA”是合法的流名称。 例如,名为“sample”的文件中名为“$DATA”的流的全名将是“sample:$DATA:$DATA”。 如果在同一个文件上创建了一个名为“bar”的流,它的全名将是“sample:bar:$DATA”

在创建和处理文件名为单字符的文件时,请在文件名前加上句点和反斜杠 (.),或者使用完全限定的路径名。 这样做的原因是 Windows 会将单字符文件名视为驱动器号。 当使用相对路径指定驱动器号时,驱动器号与路径之间用冒号分隔。 如果单字符名称是驱动器号还是文件名存在歧义,则如果冒号后面的字符串是有效路径,则 Windows 会假定它是驱动器号,即使驱动器号无效。

流类型

下面是 NTFS 流类型的列表,也称为属性类型代码。 某些流类型在 NTFS 内部,其格式未记录。

流类型 说明
::$ATTRIBUTE_LIST 包含构成文件的所有属性的列表,并标识每个属性的位置。
::$BITMAP 索引用于管理目录的 b 树可用空间的位图。 B 树以 4 KB 区块进行管理(无论群集大小如何),这用于管理这些块的分配。 此流类型存在于每个目录中。
::$DATA 数据流。 默认数据流没有名称。 可以使用 FindFirstStreamWFindNextStreamW 函数枚举数据流
::$EA 包含扩展属性数据。
::$EA_INFORMATION 包含有关扩展属性的支持信息。
::$FILE_NAME 文件的名称(以 Unicode 字符为单位)。 这包括文件的短名称以及任何硬链接。
::$INDEX_ALLOCATION 目录的流类型。 用于实现大型目录的文件名分配。 此流表示目录本身,并包含目录的所有数据。 对此类流的更改将记录到 NTFS 更改日志中。 $INDEX_ALLOCATION 流类型的默认流名称是 $I30,因此“DirName”、“DirName::$INDEX_ALLOCATION”和“DirName:$I30:$INDEX_ALLOCATION”都是等价的
::$INDEX_ROOT 此流表示索引的 b 树的根。 此流类型存在于每个目录中。
::$LOGGED_UTILITY_STREAM 类似于 ::$DATA 但操作记录到 NTFS 更改日志中。 由 EFS 和事务性 NTFS (TxF) 使用。 EFS 的“:StreamName:$StreamType”对是“:$EFS:$LOGGED_UTILITY_STREAM”,TxF 对是“:$TXF_DATA:$LOGGED_UTILITY_STREAM”
::$OBJECT_ID 用于标识链接跟踪服务的文件的 16 字节 ID。
::$REPARSE_POINT 重新分析点数据。

 

使用流