如何避免打开已经打开的worddocument?

时间:2011-04-18 09:35:55

标签: c# .net

在我的场景中,我正在以戏剧性的方式打开Word文档。如果程序打开同一文档,它应该提示用户文档已经打开。

Process[] pro = Process.GetProcessesByName("WINWORD");
if (pro.Length > 0)
{
    foreach (Process p in pro)
    {
       p.kill(); 
    }
}

我正在使用上面的代码来查找进程并查杀已打开的文档。问题是它正在杀死word.exe,以便所有其他打开的文档也关闭。

如何找到文档的名称并仅关闭该特定文档?

我使用p.MainWindowTitle来获取已打开文档的名称,但它没有显示所有打开的文档,而是显示第一个打开的文档名称。

什么是正确的解决方案?

2 个答案:

答案 0 :(得分:3)

您可以使用File.Open方法以非共享模式FileShare.None打开文件。

FileStream stream = null;
bool isOpen = false;
try
{
   stream = File.Open(@"DFilePath&Name",FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch(IOException)
{
  isOpen = true;
  //Show your prompt here.
}
finally
{
    if (stream != null)
        stream.Close();
}
if(!isOpen)    
  Process.Start(@"FilePath&Name");

如果文件已经打开,它将抛出一个IOException,您可以捕获并显示您的提示。

顺便说一下,如果您只需要显示提示,为什么要首先杀死所有进程?

答案 1 :(得分:1)

更新

这是一个通用的解决方案。

  • 您需要添加对Microsoft.Office.Interop.Word
  • 的引用
  • 我认为Word Interop甚至可以指定默认参数。这很乏味但是如果你问我的话,它比获得窗口标题更加繁琐,而且更加强大。

使用Microsoft.Office.Interop.Word

using Microsoft.Office.Interop.Word;

class Program
{
    static void Main()
    {
        // Open a doc file.
        Application application = new Application();
        Document document = application.Documents.Open("C:\\word.doc");

        // Close word. if desired
        // application.Quit();
    }
}

我怀疑单词会自动阻止两次打开同一个文档。如果没有,则Documetns界面枚举任何当前打开的文档,以便您可以事先检查