很多文件都有自己的独特元数据扩展, 典型的就是 JPG 图片的 EXIF 信息. 在管理大量文件的时候注意到元数据的重要性, 写给计算机看的元数据是文件头, 是数据包头. 写给人类看的, 规范的文件元数据很少, 应用广泛的除了 EXIF, 还有用在音频文件的 IDv2, IDv3 标签, 视频封装容器格式中用来保存封面的元信息, 电子书的书籍信息, 电子文档里面 Microsoft 给 Excel, Word, PPT 都添加了各种各样的元信息, 一些归档软件还能给 ZIP 添加注释.

对于这类基于文件格式的元信息还是主要看操作这类文件格式的软件的适配, 而更加深入一层的是文件系统的元信息, 比如 NTFS 的备用数据流(Alternate data stream, ADS):

- **NTFS #Alternate data stream (ADS) - Wikipedia**: https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)

- [MS-FSCC: NTFS Streams | Microsoft Learn](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c54dec26-1551-4d3a-a0ea-4fa40f848eb3)

应用程序可以直接在文件系统上给文件添加额外的元信息, 目前使用这种原理的软件给文件添加额外信息的软件只发现了一个: Directory Opus. 当然也能自己用 PowerShell 给文件添加和读取备用数据流:

![用 PowerShell 给文件添加备用数据流]()

- [Streams - Sysinternals | Microsoft Learn](https://learn.microsoft.com/en-us/sysinternals/downloads/streams)

但是说了这么多, 上面提到的元信息都是只针对文件的, 对文件夹的元信息, 就算是 NTFS 的备用数据流也没有办法. 虽然直接用文件夹名称存储元信息是一种直观的办法, 但是限制就会变得很多, 比如特殊字符, 来自操作系统的路径长度限制, 来自归档文件格式算法的路径长度限制([tar 限制 255 个字符](https://www.gnu.org/software/tar/manual/html_section/Formats.html)), 来自文件系统的路径长度限制(NTFS 限制 65535 个字符), 如果不选择更好的办法, 用文件夹名称的写元信息就会陷入一个来自方方面面的 "木桶效应". 没有任何文件系统支持给文件夹添加元数据, 或许就只能另辟蹊径了, 比如给文件目录建立索引, 然后在索引里面写元信息, 类似于给文件目录建数据库, 当然最后还要用其他的软件读取数据库和目录建立操作关系, 相当于要重写一个文件管理器软件. 更加简单的索引比如 [Descript.ion](https://zh.wikipedia.org/zh-hans/Descript.ion) 目前还在使用, 被 ACDSee, XnView, Total Commander 还有 7-Zip, 以及上面提到过的 Directory Opus 采用. 这些软件要么本身就是一个文件管理器, 要么就是附带操作文件目录的功能的软件.

文件夹也需要元信息, 但解决办法还没有找到, 或许以后也只能求助于第三方文件管理器了.

Reply to this note

Please Login to reply.

Discussion

# NTFS 备用数据流(ADS)的应用

唯一支持保存 NTFS 数据流的归档格式是 RAR, 而唯一支持 RAR 归档生成的软件是 WinRAR. 不知道带有 NTFS 数据流的文件被放在了在其他文件系统会怎么样呢?

NTFS 数据流可能会被用来标记一些 Windows 软件生成文件的特殊属性. 现在还能随时见到, 从 Telegram 下载的部分文件可能会在 `Zone.Identifier` 的 ADS 中被标记为 `3`(常见的有 exe 和归档文件格式), 这个标记在注册表中有对应的条目 `URLACTION_SHELL_EXECUTE_HIGHRISK`, 被用来标记 Windows XP SP2 或 IE6 以上版本从 URL 中得到的 "可能被病毒或其他恶意代码利用的文件类型". 这个标记称为 "URL安全区域(URL Security Zones)", 其值有 `0`, `1`, `2`, `3`, `4`, 分别对应本地计算机, 本地网络, 受信任站点, 互联网, 受限站点. Telegram 下载的敏感文件对应区域 `3`, 位于**互联网**文件的安全策略中:

About URL Security Zones (Windows) | Microsoft Learn:

https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms537183(v=vs.85)

这些被标记的文件类型有很详细的设定:

IE security zones registry entries for advanced users - Browsers | Microsoft Learn:

https://learn.microsoft.com/en-us/troubleshoot/developer/browsers/security-privacy/ie-security-zones-registry-entries#zones

其每个文件类型对应一个策略标记:

URL Policy Flags (Windows) | Microsoft Learn:

https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms537179(v=vs.85)

常用的有 `0x00`(允许), `0x01`(提示), `0x03`(禁止). Telegram 下载的 RAR 归档文件会被弹出提示, 被归类成了 `1806`: Miscellaneous: Launching applications and unsafe files, 默认操作是 `0x01`(提示). 然而URL安全区域早就已经是 Internet Explorer 开发中的老东西了.

#Windows #NTFS #文件管理

nostr:nevent1qqsgw9jx5nvvv5jv9t7xrsql56kmmnnp6e5un7fdeyjsunx6hetv7kcppemhxue69uhkummn9ekx7mp0qy08wumn8ghj7mn0wd68yttsw43zuam9d3kx7unyv4ezumn9wshszynhwden5te0dehhxarj9e3hstndwvhszythwden5te0dehhxarj9emkjmn99uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcpzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcpz4mhxue69uhhyetvv9ujumn0wd68ytnzvuhszxnhwden5te0wfjkccte9eeks6t5vehhycm99ehkuef0qyd8wumn8ghj7un9d3shjvfwdehhxarjvd5xzapwd9hj7qg6waehxw309aex2mrp0yezumn0wd68ycmgv96zu6t09uhgvuwq

这几天年末归档本地数据改用了 7z, 发现 7z 也支持 ADS 数据流, 不过只能在 WIM(Windows Imaging Format) 归档格式里用, 这是种 Microsoft 开发来专门用作磁盘镜像的文件格式, 类似于 VHD 和 VHDX.

另外尝试了一下 Directory Opus, 发现它默认使用 ADS 数据流为文件保存的描述储存在 SummaryInformation 标签里, 文件夹是 OpusMetaInformation 标签; 具体的数据格式也是专门设计的, 从 Directory Opus 范围之外覆写并不轻松[1][2].

如果文件和文件夹元数据连流行的归档格式都不支持, 甚至限定在某种文件系统里, 某种专有软件里, 那作为解决办法就非常局限且不可靠了.

[1]: Edit the NTFS ADS OpusMetaInformation from the command line? - Help & Support - Directory Opus Resource Centre: https://resource.dopus.com/t/edit-the-ntfs-ads-opusmetainformation-from-the-command-line/41287

[2]: Reading OpusMetaInformation powershell - Help & Support - Directory Opus Resource Centre: https://resource.dopus.com/t/reading-opusmetainformation-powershell/31850

接下可能会尝试使用 Descript.ion, 因为它是个结构简单的纯文本文件, 目前受部分流行的第三方文件管理器支持.

但是它起源于 1989 年的 MS-DOS 时代, 又不是 Microsoft 执行的标准, 发展到现在它的 "标准" 已经变得混乱. 据说他是为了解决 8.3 文件名无法写入更多信息产生的[1]... 真是讽刺.

与之类似的东西还有 BBS 时代的 file_id.diz 和 *.nfo, 当然现在也还有. 常常出现在各种盗版软件的资源包里, 也是用来描述元信息文件, diz 是描述文件和文件夹用途的, nfo 是描述开发者的. 更现代一点, 是 README.md 这种约定俗成的自述文件. 但是这些东西都不是专门用来记录文件和文件夹元信息的(diz 也是种自述文件).

[1]: windows - "descript.ion" file spec? - Stack Overflow: https://stackoverflow.com/questions/1810398/descript-ion-file-spec#comment1699208_1810398