使用MS Word更新文件时,Azure存储文件共享会丢失元数据

时间:2017-05-09 15:54:05

标签: c# azure ms-word azure-storage azure-storage-files

我们正在通过Azure存储帐户使用文件共享。作为我们应用程序的一部分,我们为每个文件分配ID并将此ID存储在元数据中: ID in Metadata

通过以下代码块设置此ID:

    public static void SetId(this CloudFile cloudFile, Guid id)
    {
        cloudFile.Metadata[DocumentDbId] = id.ToString();
        cloudFile.SetMetadata();
    }

但是,当在Microsoft Word 2013中编辑此文件(所有文件都是.docx)时,此元数据将被清除,我们会丢失引用。enter image description here

如果我创建了一个文本文件,请在元数据中为其分配一个ID,然后使用记事本对其进行编辑,然后此元数据将保留在应该存在的位置而不会被擦除。

为什么使用MS Word进行编辑会擦除元数据?以及如何防止这种情况发生?是否有其他方法可以设置未编辑的任意ID?

UPD:为了澄清这是我的方案: 我通过net use K: \http://myaccount.file.core.windows.net \tests /u:AZURE\myaccount uNrI0yyRxyMx将文件共享挂载到本地驱动器,我在驱动器上放了一个.docx文件。在MS Azure存储资源管理器中,我右键单击该文件,添加元数据 - 任何元数据,保存它(使用C#如上所述,但结果是相同的)。再次检查以验证是否已保存元数据。然后从MS Word中挂载的驱动器中打开此文件,进行更改,保存。去检查文件中的元数据,那里什么都没有。

但是如果我创建一个txt文件,添加元数据,然后使用记事本++编辑该文件,保存它。元数据没有消失。所以MS Word会擦除元数据

1 个答案:

答案 0 :(得分:0)

我有一个confirmation from Microsoft engineer Json Shay,当写入文件时,MS Word会做一些时髦的东西:

  

原因是MS Word(和许多应用程序)在保存文件时使用Win32 ReplaceFile()API,这实际上是一组移动+移动+删除操作。具体来说,MS Word:

     

将新版本的文件写入 new 临时文件,该文件不包含任何属性:~newfile.docx   重命名existingfile.docx - > existingfile_backup.docx   重命名~newfile.docx - > existingfile.docx   删除existingfile_backup.docx   这些属性写在原始的existingfile.docx上,然后重新命名,然后删除。

     

这与记事本不同,后者正在修改现有文件。