Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在加载项中获取MS Word文件二进制文件_C#_.net_Ms Word_Vsto - Fatal编程技术网

C# 如何在加载项中获取MS Word文件二进制文件

C# 如何在加载项中获取MS Word文件二进制文件,c#,.net,ms-word,vsto,C#,.net,Ms Word,Vsto,我正在为Microsoft Word开发VSTO加载项。此加载项的一个功能是,它处理打开和保存远程服务器之间的文档。通过web服务调用从远程服务器获取文件并使用addin打开它很容易,但我无法找到将更新后的文件发送回远程保存的服务器的方法。我已尝试在这样保存事件之前附加到DocumentBeforeSave private void Application_DocumentBeforeSave(Document doc, ref bool SaveAsUI, ref bool Cancel) {

我正在为Microsoft Word开发VSTO加载项。此加载项的一个功能是,它处理打开和保存远程服务器之间的文档。通过web服务调用从远程服务器获取文件并使用addin打开它很容易,但我无法找到将更新后的文件发送回远程保存的服务器的方法。我已尝试在这样保存事件之前附加到DocumentBeforeSave

private void Application_DocumentBeforeSave(Document doc, ref bool SaveAsUI, ref bool Cancel)
{
    doc.Save();
    var docuBinary = File.ReadAllBytes(doc.FullName);
    // call method to upload binary
}
然而,我得到一个IO异常,表示另一个进程正在使用该文件(我假设该进程是word)。我尝试过类似的策略,包括使用不同文件名的
SaveAs2
方法,但我得到了相同的错误。我也尝试过手动创建一个文件流并从中读取,但我得到了相同的错误

我有一种工作方法,那就是保存文档,然后将其复制到临时文件,然后读取临时文件的内容并上传。所以基本上这个

private void Application_DocumentBeforeSave(Document doc, ref bool SaveAsUI, ref bool Cancel)
{
    doc.Save();
    string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
    File.Copy(doc.FullName, tempFile);
    var docuBinary = File.ReadAllBytes(tempFile);
    // upload...
}
我不知道为什么
File.Copy
可以访问该文件,而其他方法则不能(可能是File.Copy接触到操作系统?),但是,我只是不太喜欢这种方法,因为它看起来非常粗糙,注定会以某种无法预料的方式失败


那么有更好的方法吗?是否有我不知道的方法可以将文件发送到URL,是否有方法可以从Document对象(或其他.NET对象)获取原始二进制文件?

即使您使用
file.Copy
的方法有效,另一种不太为人所知的检索当前打开文档的文件的方法是使用
IPersistFile
COM接口。此接口由
文档
对象实现

以下示例将文档保存到指定位置。这种情况在不修改文档保存状态的情况下发生,即您可以在文档打开时获得文档的确切版本(而不是之前保存到磁盘的版本),并且用户以后仍然可以决定是否保存文档的可能修改

public static void SaveCopyAs(this Document doc, string path)
{
    var persistFile = (System.Runtime.InteropServices.ComTypes.IPersistFile)doc;
    persistFile.Save(path, false);
}

我不确定这与复制方法相比有何改进。我仍然需要从打开的文件中创建一个单独的文件,然后从该文件中读取二进制文件。@AndrewBonsall它会在不修改文档的情况下为您提供文档文件的副本-因此保存状态、保存时间戳等不受影响。它允许您保存未保存文档的文件副本,而无需先保存。使用file.copy有什么问题?从技术上讲,没有什么问题。我只是不喜欢这样,我必须将文件写入磁盘。使用File.Copy是一种变通方法,我更喜欢一种更直接的方法。