文件流(本地文件系统)
流是字节序列。 在 NTFS 文件系统中,流包含写入文件的数据,并提供有关文件的详细信息,而不是属性。 例如,可以创建包含搜索关键字的流,也可以创建创建文件的用户帐户的标识。
与文件关联的每个流都有自己的分配大小、实际大小和有效数据长度:
- 分配大小是为流保留的磁盘空间量。
- 实际大小是调用方使用的字节数。
- 有效数据长度(VDL)是从流的分配大小初始化的字节数。
每个流还维护自己的压缩、加密和稀疏状态。 文件上的 FILE_ATTRIBUTE_SPARSE_FILE 属性在 dwFileAttributes 从 findFirstFile返回的 WIN32_FIND_DATA结构的成员中设置,FindFirstFileEx,FindNextFile 函数(如果任何流都稀疏)。 GetFileAttributes、GetFileAttributesEx、GetFileAttributesTransacted、GetFileInformationByHandle,GetFileInformationByHandleEx 返回默认数据流的稀疏状态(如果未指定任何流)。
没有与流关联的文件时间。 更新文件中的任何流时,文件的文件时间将更新。
每个流维护机会锁。 每个流也维护共享模式。 在文件上请求删除访问权限时,作系统会检查文件中所有打开的流上的删除访问权限。 如果另一个进程打开了没有 FILE_SHARE_DELETE 权限的流,则无法打开文件以删除访问权限。
如果复制的文件具有数据流和使用网络重定向程序,则仅当客户端同时具有读取权限和读取属性权限时,才能复制该文件。
流的命名约定
从 Windows shell 命令行指定时,流的全名为“文件名:流名称:流类型”,如以下示例所示:“myfile.dat:stream1:$DATA”。
对于文件名合法的任何字符,对于流名称(包括空格)也是合法的。 有关详细信息,请参阅 命名文件。 流类型(也称为属性类型代码)是 NTFS 文件系统的内部类型。 因此,用户无法创建新的流类型,但可以打开现有的 NTFS 文件系统类型。 流类型说明符值始终以美元符号 ($) 符号开头。 有关流类型的列表,请参阅下文。
默认情况下,默认数据流未命名。 若要完全指定默认数据流,请使用“文件名::$DATA”,其中$DATA是流类型。 这相当于“文件名”。 可以使用 文件命名约定在文件中创建命名流。 请注意,“$DATA”是合法的流名称。 例如,名为“示例”的文件中名为“$DATA”的流的完整名称将是“示例:$DATA:$DATA”。 如果在同一文件上创建了名为“bar”的流,其全名将为“示例:bar:$DATA”。
创建和使用具有一个字符名称的文件时,请为文件名加上句点后跟反斜杠(.),或使用完全限定的路径名称。 这样做的原因是 Windows 将单个字符文件名视为驱动器号。 使用相对路径指定驱动器号时,冒号会将驱动器号与路径分开。 如果单字符名称是驱动器号还是文件名存在歧义,则 Windows 假定如果冒号后面的字符串是有效路径,则 Windows 假定它是驱动器号,即使驱动器号无效。
流类型
下面是 NTFS 流类型的列表,也称为属性类型代码。 某些流类型是 NTFS 的内部类型,其格式是未记录的。
流类型 | 描述 |
---|---|
::$ATTRIBUTE_LIST | 包含构成文件的所有属性的列表,并标识每个属性的位置。 |
::$BITMAP | 索引用于管理目录的 b 树可用空间的位图。 b 树以 4 KB 区块(而不考虑群集大小)进行管理,这用于管理这些区块的分配。 每个目录中都存在此流类型。 |
::$DATA | 数据流。 默认数据流没有名称。 可以使用 FindFirstStreamW 和 FindNextStreamW 函数枚举数据流。 |
::$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 | 重新分析点 数据。 |
相关主题