2

如何查找是否在记事本中打开了特定的 .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。

4

3 回答 3

11

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

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

您可以尝试获取记事本实例并检查文件是否打开,但这最终不是一个好主意。如果文件未锁定,那么您应该可以随意使用它。

于 2013-08-06T13:19:58.507 回答
2

这是我刚刚提出的一个黑客解决方案,但它应该适合你。这利用了 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)。然后,您可以每隔一段时间轮询文件,当访问时间更改时,您知道文件已打开,然后您可以触发文件已打开的事件。请参阅此处的 Jeffs 帖子: Detect File Read in C#

于 2013-08-06T13:30:14.900 回答
0

您也可以使用以下策略执行此操作:似乎记事本确实对托管文件夹进行了某种锁定(尝试删除该文件夹,您会发现不能)。

您可以使用以下代码使用 C#,如何确定是哪个进程锁定了文件?检查锁定文件夹的进程列表。其中一个过程将是您的记事本。

您可以将它们按标题进行比较,作为提到的另一个答案。如果您要打开文件 - 您可以保存 PID 并将其与返回的进程之一进行比较。

于 2016-01-14T14:43:02.733 回答