如前所述,xattrs 在可用时是一个很好的解决方案。但是,当您不能使用 xattrs 时:
NTFS 备用数据流
在 Microsoft Windows 上,xattrs 不可用,但NTFS 备用数据流提供了类似的功能。ADS 允许您将任意数量的数据与文件的主要流一起存储。它们是使用
drive:\path\to\file:streamname
ADS 实际上只是它自己的具有特殊名称的文件。显然,您可以通过指定包含冒号的文件名从 Python 访问它们:
open(r"drive:\path\to\file:streamname", "wb")
然后像普通文件一样使用它。(免责声明:未经测试。)
从命令行,使用微软的streams
程序。
由于 ADS 存储任意二进制数据,因此您负责编写查询功能。
SQLite
SQLite 是您可以使用的嵌入式 RDBMS。将.sqlite
数据库文件存储在目录树旁边。
对于您添加的每个文件,还要将每个文件记录在一个表中:
CREATE TABLE file (
file_id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT
);
然后,例如,您可以将一段元数据存储为表:
CREATE TABLE organization_id (
file_id INTEGER PRIMARY KEY,
value INTEGER,
FOREIGN KEY(file_id) REFERENCES file(file_id)
);
然后你可以查询它:
SELECT path FROM file NATURAL JOIN organization_id
WHERE value == 3375 AND path LIKE '/x/%';
或者,如果您想要一个纯键值存储,您可以将所有元数据存储在一个表中:
CREATE TABLE metadata (
file_id INTEGER,
key TEXT,
value TEXT,
PRIMARY KEY(file_id, key),
FOREIGN KEY(file_id) REFERENCES file(file_id)
);
询问:
SELECT path FROM file NATURAL JOIN metadata
WHERE key == 'organization_id' AND value == 3375 AND path LIKE '/x/%';
显然,每当您读取或写入文件时,您都有责任更新数据库。您还必须确保这些更新是原子的(例如active
,向file
表中添加一列;添加文件时:set active = FALSE
、write file、fsync、setactive = TRUE
和 as cleanup 删除任何具有 的文件active = FALSE
)。
- Python 标准库包含 SQLite 支持作为
sqlite3
包。
- 从命令行,使用该
sqlite3
程序。