参考关键词
原文 译文 stream 流 main stream 主流 stream name 流名称 stream type 流类型 named stream 命名流 Alternate Data Stream(ADS) 交换数据流
NTFS卷上的所有文件由至少一个流
组成,其中主流
是一个普通、可查看的文件,也是数据存储的地方。一个数据流
的全名遵循下面的格式。
<文件名>:<流名称>:<流类型>
默认数据流没有名称,也就是说对于文件sample.txt
它的默认流的全名是sample.txt::$DATA
,其中sample.txt
是文件名,$DATA
是流类型
。
用户可以在文件中创建命名流,并以$DATA
作为合法名称,意味着这个数据流的全名是sample.txt:$DATA:$DATA
。如果用户创建了名为bar
的命名流,那么它的全名就是sample.txt:bar:$DATA
。任何用于文件名的合法字符都可用于流名称(包括空格)。更多关于流的命名格式的信息,请参考[MS-FSCC]。更多关于数据流属性的信息,请参考[MS-FSA]。
对于目录,它们没有默认数据流,但是有一个默认目录流。目录的流类型是$INDEX_ALLOCATION
。$INDEX_ALLOCATION
类型流(目录流)的默认流名称是$I30
(这一点与$DATA
类型流的“空”流名称不同)。下面的操作是等价的:
1 | Dir C:\Users |
虽然目录没有默认数据流,它们仍然可以含有命名数据流。这些交换数据流
通常不可见,但可以被DIR
命令的/R
选项发现。
交换数据流(Alternate Data Stream, ADS)是NTFS文件系统特性之一,一个文件可以有多个流,平时读写的是主数据流,其他流其实没太大区别。
下面通过实验演示:
假设存在abc文件夹,其下有123.txt和xyz.txt两个空文件
执行命令
1 | echo abc > 123.txt |
用记事本查看两个文件,会发现仅123.txt有数据为abc,
执行Dir/R
可以看到多出来了一个名为123.txt:xyz.txt:$DATA
的文件,
此文件用notepad无法直接打开,在命令行执行
1 | set /p t= < 123.txt:xyz.txt |
可得到输出def
123.txt:xyz.txt
可作为普通文件读写,在文件管理器中隐藏。