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

C# 检查是否在记事本中打开了文本文件,c#,winforms,file,file-io,C#,Winforms,File,File Io,如何查找是否在记事本中打开了特定的.txt文件 我尝试过这里提到的解决方案 但它们对Word和pdf文件很好,但对记事本中打开的txt文件不起作用 这是我写的代码 public bool IsFileOpen(string strFileName) { bool retVal = false; try { if (File.Exists(pstrFileName)) { using (FileStream stre

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

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

但它们对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可以正常工作。

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

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


您可以尝试获取记事本实例并检查文件是否打开,但这最终不是一个好主意。如果文件未锁定,则您可以自由地对其执行任何操作。

这是我刚刚提出的黑客解决方案,但它应该适合您。这利用了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();
Process[]processs=Process.GetProcessesByName(“记事本”);
for(int i=0;i
希望这能奏效。我的示例查看notepad的实例是否以窗口标题“myFile.txt-notepad”打开。窗口名始终为“filename.extension-Notepad”,因此您可以根据需要进行处理

我想您可以调用System.IO.File.GetLastAccessTime(文件路径)。然后,您可以每隔一段时间轮询一次该文件,当访问时间更改时,您知道该文件已打开,然后可以触发一个文件已打开的事件。请参见杰夫斯邮报:

您也可以使用以下策略执行此操作:似乎记事本确实在托管文件夹上持有某种类型的锁定(尝试删除该文件夹,您会发现您无法锁定)

您可以使用以下代码检查锁定文件夹的进程列表。 其中一个过程就是你的记事本

你可以将它们按标题进行比较,作为前面提到的另一个答案。
如果您发出文件打开命令,您可以保存PID并使用返回的进程之一对其进行复制。

我认为这是因为记事本只是打开文件、读取流并关闭流,因此没有锁定文件。但是Word将保持文件打开和锁定。Belogix是正确的,文件未被使用,因此您的代码工作正常。您这样做的目的是什么?如前所述,对于任何加载/读取/关闭的应用程序,这种方法都将失败。您的最终目标是什么?如果文件不影响文件,为什么要知道文件是否在记事本中打开?不可能,关闭的唯一方法是检查所有打开的记事本的窗口标题,但它们只包含文件名,而不包含路径,因此它不会真正起作用不确定我是否应该对此进行投票,因为“2222”是一个很好的数字;)我知道,我把我的大部分答案都作为评论发布,因为我喜欢2222,但我觉得3333看起来更好!;-)没有一种机制来确定文件是否是从进程实例打开的,因为进程在读取文件后没有与文件交互。它必须至少保持文件路径,否则Ctrl+S将不起作用。@AlexK.-你是对的,但你可以得到应用程序的标题,所以“Notepad-My Sample File.txt”,但一个黑客,为什么我不建议它!唯一的问题是如果我有一个文件
C:\Pete.txt
C:\Test\Pete.txt
,该怎么办。记事本中哪一个是打开的?我已经用一些可能对Vijay有用的东西修改了我的答案。我喜欢这个新想法,但这只会帮助你知道它最后一次被访问的时间,而不是用户是否仍然打开它?他们可能会立即关闭它,或者将它最小化并忘记它,因此该文件仍然会打开。以下是一个没有吃蛋糕的例子。正如其他人所说,记事本没有打开的文件句柄。我的建议充其量不过是些杂活,但如果真的需要的话,可能总比什么都没有好。它很管用,谢谢@DanielLane为我节省了时间。