繁体   English   中英

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

[英]Check if a file that's not locked is open

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

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

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

有什么解决办法吗?

“现在在Paint中打开了image1.bmp的副本” -这是您的错误-该文件不再在Paint中打开。 它被打开,读取,然后关闭。 Paint根本不会使文件保持打开状态-在RAM内存中只有其内容的副本。 换句话说,在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;

        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM