检查是否打开了未锁定的文件

时间:2016-10-25 12:31:46

标签: c# file-io file-locking filelock

某些程序(图像程序,如Paint,文本编辑器,如记事本和Wordpad等)打开文件,将内容加载到内存中,然后释放文件锁。有没有办法告诉程序是否正在使用该文件,即使它没有被锁定?

例如,即使在Paint中打开了image1.bmp,我的程序也可以覆盖磁盘上的image1.bmp副本,因为该文件未被锁定。现在,在Paint中打开的image1.bmp副本与磁盘上的image1.bmp副本不同。

我的程序是用C#编写的。我通常使用此方法来检查文件是否被锁定,但在上述情况下它不起作用。 Is there a way to check if a file is in use?

有没有解决方案?

2 个答案:

答案 0 :(得分:0)

"现在在Paint" 中打开的image1.bmp的副本 - 这是你的错误 - 文件不再在Paint中打开。它被打开,读取,然后关闭。 Paint根本不打开文件 - 它只在RAM内存中有一个COPY内容。换句话说 - 你在MS Paint中看到一张图片的事实并不意味着该文件是开放的。

这与将某个文件借给某人相当,然后他制作了一份复印件并将其归还 - 该人不再“#34;持有"该文件,他有一份单独的副本。而且,仅通过查看文档就无法知道谁可能在历史的某个时刻复制过它。

另一种表达方式是伪代码:

File file = Open("image.png");
Image img = ImageFromFile(file);
file.Close();

...

img.Save("image.png");

这里根本没有打开文件,只有RAM内容的副本。

注意:我实际检查过,对于Paint - Process Explorer可以显示打开的句柄,我在Paint中打开了一个文件,并且没有为该名称的文件列出的句柄。

答案 1 :(得分:0)

这是我想出的。我检查窗口标题的所有打开过程。如果进程有一个窗口标题,我看它是否包含我正在寻找的文件的名称。

由于某些应用程序可以在一个实例中打开多个文件,因此它不会100%的时间工作。

我根据这个问题对其进行了调整:Getting a list of all applications

        bool isFileOpen(string file)
          {    
            string windowTitle = "";


            Process[] myProcesses = Process.GetProcesses();

            foreach (Process P in myProcesses)
            {
                if (P.MainWindowTitle.Length > 1)
                {
                    windowTitle = P.MainWindowTitle;
                    if (windowTitle.Contains(file) == true)
                    {
                        return true;                        
                    }                    
                }

            }
            return false;

        }