dsofile C# API / NTFS自定义文件属性

4
我正在寻找一种良好的方法来为文件添加元数据。对于NTFS,dsofile.dll 可以很好地工作。当将副本放在FAT32共享上时,元数据会丢失(我想它使用了NTFS隐藏流)。微软Word文档包含不会丢失的元数据,他们是如何做到的呢?与FAT类似,通过电子邮件发送文件会剥离所有使用dsofile创建的元数据(以及使用Windows资源管理器手动创建的元数据)。单独的元数据文件不是一个选项。它必须与标准的Windows技术兼容。如果我向某人发送带有Outlook的文件,并且他将其发送回来,则不应丢失元数据。

(所需的元数据实际上只是一个ID)


Word不是将所有元数据都作为文件的一部分存储吗? - Michael Stum
1
是的。MS-Word将元数据存储在.doc文件格式本身中。NTFS隐藏数据流是一个独立的元数据存储机制,它不需要文件格式本身意识到元数据的存在。缺点是,简单的应用程序在复制文件时不会复制NTFS隐藏流中的元数据。 - Cheeso
3个回答

2
问题在于所有文件系统都将文件提供为单一流的视图,作为最大公约数。通过这个界面暴露出文件的“内容”,你可以读取或存储属性,并让它们被天真的系统(或用户)工具传输。例如,Windows中的CopyFile会仔细丢失备用数据流,并且没有“影子文件”的概念。
问题是“内容”的格式是否允许任意添加属性。
一些格式允许任意内容(例如MSFT的docfile,也称为.doc/.xls等)。有些允许有限内容(.mp3,.jpg,.exe)。
有些完全无解(.txt,.bmp)。

1

任何解决方案都会依赖于格式。MS Office文件是复合文件,其中有属性的位置。在某些格式(例如PE文件)中,如果您知道如何在以后读取它们,则可以安全地将数据附加到文件末尾。在ZIP文件中,您可能可以在目录中找到一个位置,或者只需向存档中添加带有您的数据的辅助文件即可。其他格式无法承受此类操作,您需要找到自己解决问题的方法。

实际上,文件名也可以成为您ID的良好占位符。

如果您需要将文件存储在某个地方,但不需要外部应用程序继续读取该文件,则可以将它们打包到ZIP存档中,或使用类似我们的SolFS库的东西。


在zip格式中,目前没有正式机制将“隐藏数据流”中的NTFS元数据存储到zip条目中。通常情况下,这些NTFS元数据根本不会存储在zip中。 - Cheeso

0

除了自定义的DSOFile属性,标准属性如注释、作者等呢?它们会被清除吗?

不确定是否理想,但我们解决这个问题的方法是使用一个工具,将DSOfile属性保存为文本文件,然后与文件一起发送电子邮件,在另一端用户运行工具以重新导入dsofile属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接