自定义文件属性

BOUNTY开始了,但我想在C#中做例子

我需要遵循:

在我的申请中,我有文件。 需要一直检查和退出的文件。 当我从我的应用程序中检查一个Document时,我需要将自定义属性添加到文件中,这样我以后可以在我签入文档时识别它。

我尝试使用以下代码使用DSOFile的OleDocumentProperties,但没有成功:

// Adding custom properties to file (Parameters: FileName, custom property name, value, debug: true/false DocumentProperties.WriteDocumentProperty(filename, "dms_dossiernummer", _dossiernummer.ToString(), false); DocumentProperties.WriteDocumentProperty(filename, "dms_zaaknaam", ReturnZaaknaam(_dossiernummer), false); DocumentProperties.WriteDocumentProperty(filename, "dms_verantw_medew", ReturnVerantwMedew(_dossiernummer), false); DocumentProperties.WriteDocumentProperty(filename, "dms_document_path", path, false); DocumentProperties.WriteDocumentProperty(filename, "dms_bestandsnaam", bestandsNaam, false); DocumentProperties.WriteDocumentProperty(filename, "dms_bestands_id", bestandId, false); DocumentProperties.WriteDocumentProperty(filename, "dms_is_checkedout", "true", false); DocumentProperties.WriteDocumentProperty(filename, "dms_dossier_map_id", dossierMapId, false); DocumentProperties.WriteDocumentProperty(filename, "dms_bestand_versie_nummer", Queries.Dms.Selects.GetDocumentVersion( Convert.ToInt32(bestandId)).ToString(), false); DocumentProperties.WriteDocumentProperty(filename, "dms_bestands_locatie", path, false); 

有没有人知道将自定义文件属性添加到文件的另一种方法?

什么是文件?

基本上,文件只是一个字节流和文件系统与之关联的一些元数据。 在早期文件系统中,元数据基本上只是文件名和一些日期戳。 像NTFS这样的新文件系统可以选择添加额外的元数据。

文档属性来自何处?

在Windows资源管理器中,您可以看到许多文件类型的很多文档属性。 漂亮的统一界面表明存在一些统一的属性存储。 事实并非如此。 Explorer Shell具有可扩展的属性表处理程序接口,可从各种文件类型中提取此信息。 有一个JFIF(JPEG)文件的处理程序,还有OLE文件(旧的Office格式)的处理程序,以及新的Office格式。

我应该在哪里放置我的元数据?

结论是:

  • 如果您可以保证只需要处理某些文件格式,请调查文件中添加元数据。 例如,

    • 如果所有文件都是旧式Office文档(.doc),则为OLE属性

    • 如果所有文档都是新式Office文档(.docx),请使用Open XML API

  • 如果可以保证所有安装都在特定文件系统上,请调查文件系统的function。 其他回复已经考虑过如何使用NTFS做到这一点。

  • 否则,您必须设计自己的数据存储。 伴随文件显然是可能的; 您可以将元数据存储在数据库中; 或者您可以为每个目录创建一个文件,以保存该目录中文件的所有元数据。 考虑是否可能会遇到针对同一文件的多个请求的并发问题。 使用数据库可能会使处理更简单。

备用数据流将允许您存储所需的任何数据。 谨防; 如果将文件复制到非NTFS文件系统,额外的数据将被删除。

这篇文章应该可以帮助您入门

– 编辑1/2/2014 –
以下是更多信息: http : //www.codeproject.com/Articles/2670/Accessing-alternative-data-streams-of-files-on-an http://www.dreamincode.net/forums/topic/90666-读取和写入alternate-streams-in-c%23 / NTFS备用数据流 – .NET

还有一个用于从命令行创建/查看ADS: http : //www.undermyhat.org/blog/2012/05/copy-delete-or-rename-alternate-data-streams-using-only-standard-windows-命令提示的工具/

虽然可以使用DSOFile.dll打开任何类型的文件,但不会保留自定义属性,除了OLE结构化存储/ Ole文档( http://en.wikipedia.org/wiki/COM_Structured_Storage )之类的旧文件格式Microsoft Office文件(.doc,.xls等)和一些CAD文件。

正如Brad写的那样,你可以使用备用数据流,但它也具有依赖性,即NTFS文件系统。

我建议你不要这样做……

如果你使用了一个新文件,那该怎么办? .props等?

这里有多种选择。

如上所述,如果您可以保证您的文件始终位于NTFS上,则备用数据流是一个不错的选择。

您可以将自定义属性编写为JSON,XML,序列化对象,甚至是简单的行+分隔符格式。

不幸的是,使用.NET并不完全可用,你必须使用P / Invoke和CreateFile。

 [DllImport( "kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true )] private static extern SafeFileHandle CreateFile( string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile ); 

然后,您必须使用文件路径创建数据流,然后使用冒号,然后使用流的名称作为文件名,并将CreateFile返回的SafeFileHandle传递给FileStream的构造函数。 CreateFile的所有其他选项与通过此API打开文件一样正常。

请注意,如果要写入备用数据流,则必须具有该文件的写入权限。

这是CreateFile的参考。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

这是一些有用的常量:

  private const uint GENERIC_WRITE = 0x40000000; private const uint GENERIC_READ = 0x80000000; private const uint FILE_SHARE_READ = 0x00000001; private const uint FILE_SHARE_WRITE = 0x00000002; private const uint CREATE_NEW = 1; private const uint CREATE_ALWAYS = 2; private const uint OPEN_EXISTING = 3; private const uint OPEN_ALWAYS = 4; 

不需要P / Invoke且对NTFS以外的文件系统友好的方法是创建第二个文件,其中包含原始文件的完整路径名+添加的另一个扩展名。 同样,您可以使用首选的方法在此文件中存储属性。 但是,这样做的缺点是,如果用户移动文件,他们也必须移动属性。

我终于找到了一种简单的方法来向Word文档添加文档属性。

只需使用DSOFile.dll 🙂

奇迹般有效!