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