本地文件系统) (文件流

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

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

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

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

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

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

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

流的命名约定

从 Windows shell 命令行指定时,流的全名为“filenamestream namestream type”,如以下示例中所示:“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 流类型的默认流名称为 $I 30,因此“DirName”、“DirName::$INDEX_ALLOCATION”和“DirName:$I 30:$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 重新分析点数据。

 

使用流