【问题标题】:Custom File Properties自定义文件属性
【发布时间】:2013-12-17 11:13:03
【问题描述】:

我需要关注:

在我的应用程序中,我有文件。需要随时检查的文件。当我从我的应用程序中签出文档时,我需要将自定义属性添加到文件中,以便稍后在我要签入文档时识别它。

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

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

【问题讨论】:

  • 上下文是什么?共享点?你谈到签入文件。在哪里检查?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @JohnSaunders 它用于 C# 应用程序。我正在构建自己的文档管理系统。
  • 大多数 Win32 API 都可以从 C# 调用,只是需要更多的工作。阅读他链接的文章,然后阅读"P/Invoke"
  • 为什么不在结帐时向结帐目录添加一个文件,其中包含该路径中所有项目的元数据?一个拉SVN。下面是 Olly 回答的最后一个要点:D

标签: c# file properties


【解决方案1】:

什么是文件?

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

文档属性从何而来?

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

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

结论是:

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

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

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

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

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

【讨论】:

  • 我需要创建一个库来存储有关媒体文件(视频、音频、文档)的信息。 MD 是一个包含许多细节的自定义结构,我希望将其全部存储在文件本身中,并拥有一个能够分析 MD 并显示它或通过它搜索的客户端应用程序。我对外部文件或数据库的问题是文件被删除时会发生什么。所以我的简单问题是,如果我不介意坚持使用 NTFS,我可以将任何元数据存储到 NTFS 中的任何文件吗?另一个问题是,当文件复制到兼容的系统时,Windows 是否会保留 MD,或者至少在复制时会丢失警告。
  • @Shimmy 它看起来好像 Brad 的答案中指向 this article 的链接几乎正是您所追求的,尽管它看起来好像 Windows 不会警告您丢失额外的复制到非 NTFS 卷时的信息。
【解决方案2】:

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

Here 是一篇可以帮助您入门的文章

-- 2014 年 1 月 2 日编辑 --
这里还有一些: 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/

【讨论】:

    【解决方案3】:

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

    正如 Brad 所写,您可以使用备用数据流,但这也有依赖关系,即 NTFS 文件系统。

    我不建议你走这些路……

    如果你使用了一个新文件,例如。 <original file>.props 之类的?

    【讨论】:

      【解决方案4】:

      这里有多种选择。

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

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 1970-01-01
        • 2018-11-04
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 2016-06-11
        相关资源
        最近更新 更多