检查是否在记事本中打开了文本文件

时间:2013-08-06 13:15:07

标签: c# winforms file file-io

如何查找是否在记事本中打开了特定的.txt文件?

我尝试过这里提到的解决方案

Is there a way to check if a file is in use?

但它们适用于Word和pdf文件,但不适用于在记事本中打开的txt文件。

这是我写过的代码。

public bool IsFileOpen(string strFileName)
{
    bool retVal = false;
    try
    {
        if (File.Exists(pstrFileName))
        {
            using (FileStream stream = File.OpenWrite(pstrFileName))
            {
                try
                {    
                }
                catch (IOException)
                {
                    retVal = true;
                }
                finally
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
        }
    }
    catch (IOException)
    { //file is opened at another location 
        retVal = true;
    }
    catch (UnauthorizedAccessException)
    { //Bypass this exception since this is due to the file is being set to read-only 
    }
    return retVal;
} 
我在这里错过了什么。??

我的要求: 我的应用程序与VSS类似。当用户签出特定文件并打开时,并在打开时尝试签入。应用程序假设发出警告消息。为此我使用了上述功能。它适用于word和pdf。

3 个答案:

答案 0 :(得分:11)

扩展我的评论。仅当应用程序保持句柄处于打开状态时,才会锁定文件。例如,Word将打开文件,在流中读取并维护句柄,以便其他应用程序在用户处理时无法删除该文件。

记事本和其他应用程序,只需打开文件,读入整个流,然后关闭文件,释放他们拥有的锁。这意味着文件不再被锁定,可以被其他应用程序编辑甚至删除,而记事本也不会关心,因为它在内存中有自己的副本。

您可以尝试使用记事本实例并检查文件是否已打开,但这最终不是一个好主意。如果文件没有被锁定,那么你可以自由地用它做你想做的事。

答案 1 :(得分:1)

这是我刚刚提出的一个黑客解决方案,但它应该适合你。这使用了System.Diagnostics。

Process[] processes = Process.GetProcessesByName("notepad");
        for (int i = 0; i < processes.Length; i++)
        {
            Console.WriteLine(processes[i].MainWindowTitle);
            if (processes[i].MainWindowTitle.Equals("myFile.txt - Notepad"))
            {
                Console.WriteLine("The file myFile is Open!");
            }
        }
        Console.ReadLine();

希望这应该成功。我的示例查看是否打开了一个带有窗口标题“myFile.txt - Notepad”的记事本实例。窗口名称始终是“filename.extension - Notepad”,因此您可以根据需要处理。

我想你可以调用System.IO.File.GetLastAccessTime(filePath)。然后,您可以经常轮询该文件,当访问时间发生变化时,您知道该文件已被打开,然后您可以触发该文件已被打开的事件。见杰夫斯在这里发帖: Detect File Read in C#

答案 2 :(得分:0)

您也可以使用以下策略执行此操作:似乎记事本确实在托管文件夹上保留了某种锁定(尝试删除该文件夹,您将看到您不能)。

您可以使用以下代码Using C#, how does one figure out what process locked a file?来检查锁定文件夹的进程列表。 其中一个过程就是你的记事本。

你可以通过Title比较提到的另一个答案。 如果您发出文件的打开 - 您可以保存PID并使用其中一个返回的进程进行comapre。