1

我们通过 Azure 存储帐户使用文件共享。作为我们应用程序的一部分,我们为每个文件分配 ID 并将此 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 会做一些事情来擦除元数据

4

1 回答 1

0

从微软工程师 Json Shay 那里得到了确认,MS Word 在写入文件时会做一些时髦的事情:

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

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

这与记事本不同,记事本在原地修改现有文件。

于 2017-05-10T09:51:55.607 回答