C#学习教程:自定义文件属性分享


自定义文件属性

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格式。

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

结论是:

  • 如果可以保证所有安装都在特定文件系统上,请调查文件系统的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 🙂

    奇迹般有效!

    上述就是C#学习教程:自定义文件属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

    本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

    如若转载,请注明出处:https://www.ssfiction.com/ckf/1031989.html

    发表评论

    邮箱地址不会被公开。 必填项已用*标注