自定义文件属性

时间:2013-12-17 11:13:04

标签: c# file properties

BOUNTY已启动,但我想在C#中进行示例

我需要关注:

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

我尝试使用以下代码使用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);

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

5 个答案:

答案 0 :(得分:10)

什么是文件?

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

文档属性来自哪里?

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

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

结论是:

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

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

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

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

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

答案 1 :(得分:6)

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

Here是一篇应该让你入门的文章

- 编辑1/2/2014 -
这里还有一些: http://www.codeproject.com/Articles/2670/Accessing-alternative-data-streams-of-files-on-an http://www.dreamincode.net/forums/topic/90666-reading-and-writing-alternate-streams-in-c%23/ NTFS Alternate Data Streams - .NET

用于从命令行创建/查看ADS: http://www.undermyhat.org/blog/2012/05/copy-delete-or-rename-alternate-data-streams-using-only-standard-windows-command-prompt-tools/

答案 2 :(得分:3)

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

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

我建议你不要这样做......

如果你使用了新文件,那该怎么办? <original file>.props或其他?

答案 3 :(得分:2)

这里有多种选择。

如上所述,如果您可以保证您的文件始终位于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以外的文件系统友好的方法是创建第二个文件,其中包含原始文件的完整路径名+添加了另一个扩展名。同样,您可以使用首选的方法在此文件中存储属性。但是,这样做的缺点是,如果用户移动文件,他们也必须移动属性。

答案 4 :(得分:-1)

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

只需使用DSOFile.dll:)

像魅力一样!