2013-08-06 249 views
2

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

+11

我相信这是因为记事本只是打开文件,读取流并关闭流,因此不锁定文件。不过Word会保持文件打开并锁定。 – Belogix

+0

Belogix是正确的,该文件没有被使用,因此你的代码工作正常 – x4rf41

+0

所以任何工作? –

回答

10

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

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

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

+5

不知道我是否应该upvote这个,因为“2,222”是这样一个很好的数字;) –

+4

我知道,我一直张贴我的答案作为评论的大部分,因为我喜欢2,222,但我认为3,333看起来更好! ;-) – Belogix

+0

没有一种机制来确定文件是否从进程的实例打开,因为进程在读取文件后没有与文件进行交互。 –

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 - 记事本”打开记事本实例。窗口名称始终是“filename.extension - 记事本”,所以您可以处理,但可能需要。

我想你可以打电话给System.IO.File.GetLastAccessTime(filePath)。然后,您可以每隔一段时间轮询一次该文件,并在访问时间发生变化时知道该文件已被打开,然后可以触发该文件已被打开的事件。看杰夫张贴在这里: Detect File Read in C#

+0

只要标题不包含文件的完整路径,这将无法正常工作... – Bolu

+0

@CapTec这不会为我的requiremnet工作。 –

+0

唯一的问题是如果我有一个'C:\ Pete.txt'和'C:\ Test \ Pete.txt'文件。在记事本中打开哪一个? – Belogix

0

你也可以这样做使用以下策略:看起来,记事本确实对主机文件夹持有某种锁(尝试删除文件夹,你会看到你不能)。

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

你可以通过标题作为另一个答案进行比较。 如果您正在发布文件的打开 - 您可以保存PID并将其与其中一个返回的进程混合。