检查是否在记事本中打开了文本文件
本文关键字:文本 文件 是否 记事本 检查 | 更新日期: 2023-09-27 18:26:45
如何查找记事本中是否打开了特定的.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将打开文件,读取流并维护句柄,以便其他应用程序在用户处理该文件时无法删除该文件
Notepad和其他应用程序只需打开文件,读取整个流,然后关闭文件,释放锁定即可。这意味着该文件不再被锁定,可以由另一个应用程序编辑甚至删除,Notepad也不会在意,因为它在内存中有自己的副本。
你可以尝试获取记事本的实例并检查文件是否打开,但这最终不是一个好主意。如果文件没有被锁定,那么你应该可以随意使用它。
这是我刚刚提出的一个破解解决方案,但它应该对您有效。这就利用了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-记事本"的记事本实例。窗口名称总是"filename.extension-Notepad",因此您可以根据需要进行处理。
我想你可以调用System.IO.File.GetLastAccessTime(filePath)。然后你可以每隔一段时间轮询一次文件,当访问时间改变时,你知道文件已经打开,然后你可以触发一个文件已经打开的事件。点击此处查看Jeffs的帖子:在C#中检测文件读取
您也可以使用以下策略来做到这一点:似乎记事本确实对托管文件夹有某种锁定(尝试删除文件夹,您会发现无法删除)。
您可以使用以下代码使用C#,如何计算出哪个进程锁定了一个文件?以检查锁定文件夹的进程列表。其中一个过程就是你的记事本。
你可以将它们按标题与提到的另一个答案进行比较。如果您发出打开文件的命令,您可以保存PID并将其与返回的进程之一进行通信。