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

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

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

我的程序是用C#编写的。 我通常使用这种方法来检查文件是否被锁定,但在上述情况下不起作用。 有没有办法检查一个文件是否在使用?

有没有解决这个问题的方法?


“现在在Paint中打开的image1.bmp的副本” - 这是您的错误 - 该文件不再在Paint中打开。 它被打开,阅读,然后关闭。 Paint并没有保持文件打开 - 它只在RAM内存中拥有COPY的内容。 换句话说 - 在MS Paint中看到一张图片并不意味着该文件已打开。

将文件借给某人是可比的,然后他复印并返回 - 该人不再“持有”文件,他有一份单独的文件。 仅仅通过查看文档,就没有办法知道谁可能在历史的某个时刻复制了它。

另一种说法是伪代码:

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

...

img.Save("image.png");

这里没有任何文件正在被打开,它的内容只是一个RAM副本。

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


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

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

我从这个问题调整它:获取所有应用程序的列表

        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;

        }
链接地址: http://www.djcxy.com/p/40557.html

上一篇: Check if a file that's not locked is open

下一篇: Xamarin.Forms UWP Image never closes opened File