c# - 如何避免打开已经打开的word文档?

标签 c# .net

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

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

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

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

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

什么是正确的解决方案?

最佳答案

您可以使用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,您可以捕获并显示您的提示。

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

关于c# - 如何避免打开已经打开的word文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5700973/

相关文章:

c# - Process.Start 在某些客户端上随机阻塞/挂起

c# - Xamarin 工作室 : Add UIimageView to UIView

c# - 使用错误方法的派生类

c# - 命名空间中不存在类型。你错过了一个大会吗?

javascript - 如何访问 jquery 内部数据?

c# - 使用从 UserControl 派生的类作为基础的 XAML 错误

c# - 如何生成动态for循环

c# - 如何在 lambda 表达式参数中扩展谓词

.net - 如何在两个 .NET AppDomain 之间传递未知类型?

c# - 将 IQueryable 映射到 .NET 中 OData 的域模型