2013-12-17 317 views
7

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); 

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

+0

什么是上下文?的SharePoint?你谈论检查文件。在哪里检查它? –

+1

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

@JohnSaunders它是一个C#应用程序。我正在建立我自己的文件管理系统。 – JRO

回答

8

什么是文件?

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

文档属性从哪里来?

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

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

得出的结论是:

  • 如果你能保证你只需要处理某些文件格式,探讨加入内元数据的文件。例如,

    • OLE性能,如果您的所有文件都是老式的办公文档(.doc)

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

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

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

+0

我需要创建一个存储媒体文件(视频,音频,文档)信息的库。 MD是一个很多细节的自定义结构,我想将它全部存储在文件本身中,并有一个客户端应用程序,能够分析MD并显示或搜索它。 我的外部文件或数据库问题是当文件被删除时会发生什么。 所以我简单的问题是,如果我不介意坚持使用NTFS,我可以将任何元数据存储到NTFS中的任何文件?另一个问题是,如果Windows在将文件复制到兼容sys时保留MD,或者至少警告即使在复制时也会丢失。 – Shimmy

+1

@Shimmy看起来好像Brad在下面的答案中的[这篇文章](http://www.flexhex.com/docs/articles/alternate-streams.phtml)的链接几乎就是你所期待的,尽管它看起来好像Windows在复制到非NTFS卷时不会警告您丢失附加信息。 – Olly

5

备用数据流将允许您存储任何您想要的数据。谨防;如果将该文件复制到非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

尽管可以使用DSO打开任何类型的文件File.dll,自定义属性将不会被持久化,除了像OLE结构化存储/奥莱文档(http://en.wikipedia.org/wiki/COM_Structured_Storage)之类的旧文件(.doc,.xls等)和某些CAD文件。

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

,我不建议你去这些方式...

,如果你使用了哪些新的文件,即。 <original file>.props还是这样?

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对FILESTREAM的构造函数的SafeFileHandle。 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系统的方法是创建第二个文件,原始文件的完整路径+添加了另一个扩展。再次,您可以使用您的首选方法来存储此文件中的属性。但是,这有一个缺点,即如果您的用户移动文件,他们也必须移动属性。

-1

我终于找到了一个简单的方法,以至少将文档属性添加到Word文档。

只需使用DSOFile即可。dll :)

工程就像一个魅力!