我看不到(至少某些)当前的文件系统真正需要做很多工作来支持标签。当你下来吧,多一点支持标记手段,而不是相关的一些额外的数据与文件,但不被写入字节流的该文件。
NTFS(选择一个广泛使用的示例)可以做到这一点:就NTFS而言,文件不一定是单个字节流。在NTFS上,您可以将任意数量的数据流与单个文件名相关联。每个文件都有一个(可能是空的)没有名称的“主要流”。但是,它也可以具有任意数量的其他流,每个流都必须具有一个名称。使用此功能,将名为(例如)“标签”的流添加到现有文件,(显然足够)将标签写入该流,这确实是微不足道的。
之后是比较困难的部分:让您的工具充分利用您放置在此处的标签。理想情况下,您可能希望为它们建立索引以进行快速搜索,因此您可以执行诸如为带有特定标签的所有文件创建“虚拟目录”之类的操作。
至少从我的角度来看,文件系统已经具备了所需的功能—应该存储和检索数据,并且现在可以很好地做到这一点。利用这些数据是其他工具的工作。这些工具目前尚不存在,但支持它们的文件系统基础结构确实存在。
如果允许我愤世嫉俗片刻,我想说不可避免的是,NTFS的这一功能几乎将被完全忽略和未知。毕竟,它使用简单,不需要任何特殊的API或其他任何东西。您可以在完全可移植的C,C ++或任何其他可以指定任意文件名的文件中很好地使用它。以下是一些简短的代码来演示如何使用AFS创建文件:
#include <fstream>
int main() {
std::ofstream out("test.txt");
std::ofstream tag("test.txt:tags");
out << "This is the output file";
tag << "tag1 tag2";
return 0;
}
而且,这是一些读取和显示标签的代码:
#include <fstream>
#include <iterator>
#include <iostream>
#include <string>
int main() {
std::ifstream tags("test.txt:tags");
std::copy(std::istream_iterator<std::string>(tags),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, " "));
return 0;
}
一切都很简单容易。请注意,尽管我仅在其中写入了一些琐碎的数据,但是您可以将AFS像对待其他文件一样对待-所有常用的“填充”都可以与其他任何文件一样使用。在普通目录显示中,将显示的只是主要流(例如,文件显示的大小将是主要流的大小),但是如果要查看它,dir
还可以显示有关备用流的信息与/R
标志。例如,上面创建的文件的清单如下所示:
03/16/2011 08:22 PM 23 test.txt
9 test.txt:tags:$DATA
1 File(s) 23 bytes