我们正在通过Azure存储帐户使用文件共享。作为我们应用程序的一部分,我们为每个文件分配ID并将此ID存储在元数据中:
通过以下代码块设置此ID:
public static void SetId(this CloudFile cloudFile, Guid id)
{
cloudFile.Metadata[DocumentDbId] = id.ToString();
cloudFile.SetMetadata();
}
但是,当在Microsoft Word 2013中编辑此文件(所有文件都是.docx)时,此元数据将被清除,我们会丢失引用。
如果我创建了一个文本文件,请在元数据中为其分配一个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会擦除元数据
答案 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上,然后重新命名,然后删除。
这与记事本不同,后者正在修改现有文件。