Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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 Office加载项中获取当前活动的文档文件_C#_Ms Word_Ms Office_Vsto - Fatal编程技术网

C# 在MS Office加载项中获取当前活动的文档文件

C# 在MS Office加载项中获取当前活动的文档文件,c#,ms-word,ms-office,vsto,C#,Ms Word,Ms Office,Vsto,我正在创建VSTO插件,该插件将通过RESTAPI向服务器发送文档。 我需要将当前打开的文档(例如,docx)作为文件发送 第一个问题是获取活动文档的全名。 如果找到唯一的方法: Path.Combine(Globals.ThisAddIn.Application.ActiveDocument.Path, Globals.ThisAddIn.Application.ActiveDocument.Name) 此代码可以返回本地驱动器上的正确路径:D:\Docs\Doc1

我正在创建VSTO插件,该插件将通过RESTAPI向服务器发送文档。 我需要将当前打开的文档(例如,
docx
)作为文件发送

第一个问题是获取活动文档的全名。 如果找到唯一的方法:

Path.Combine(Globals.ThisAddIn.Application.ActiveDocument.Path,
             Globals.ThisAddIn.Application.ActiveDocument.Name)
此代码可以返回本地驱动器上的正确路径:
D:\Docs\Doc1.docx
但它也可以将HTTP路径返回到云中的文档(例如,
OneDrive
):
https://d.docs.live.net/xxxxx/Docs\Doc1.docx

即使只有本地文档,我也无法获取此文档的文件。我尝试了以下代码:

using (var stream = new StreamReader(docFullPath)) { }
对于本地存储的文档,我得到了
System.IO.IOException:进程无法访问该文件,因为它正被另一个进程使用。不足为奇

对于云存储的文档,我得到了
System.NotSupportedException:给定路径的格式不受支持。当然

我相信我做错了,我的目标是可以实现的。
我的问题是:如何在不关闭应用程序的情况下从加载项读取MS Office应用程序上当前打开的文档文件?

即使您可以访问该文件
ActiveDocument。FullName
指出,无法保证用户已将所有更改保存到磁盘,甚至更糟,文档仍处于创建状态,尚未保存

还有另一种鲜为人知的/文档化的检索打开文档文件的方法,它使用
IPersistFile
COM接口,该接口由
document
对象实现。以下示例将文档保存到指定位置。这种情况在不修改文档保存状态的情况下发生,即您可以在文档打开时获得文档的确切版本(而不是之前保存到磁盘的版本),并且用户以后仍然可以决定是否保存文档的可能修改

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

您可以使用
File.copy(全名,)
在文件系统上复制打开的文档,然后将副本发送到REST服务。即使它仍然在Word中以独占方式进行读/写操作,它仍然可以工作。

顺便说一句,您可以使用
document.FullName
属性获取文档的全名。感谢您的建议,我不知道
文件。Copy
可以复制锁定的文件。但对于我来说,这个解决方案也是错误的。