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

Posted

技术标签:

【中文标题】检查未锁定的文件是不是打开【英文标题】:Check if a file that's not locked is open检查未锁定的文件是否打开 【发布时间】:2017-03-07 12:12:14 【问题描述】:

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

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

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

有什么解决办法吗?

【问题讨论】:

***.com/questions/876473/…的可能重复 我引用了上面的链接。该解决方案仅在文件被锁定时才有效 好的,这样更好 不,你可以这样做。由于文件被关闭(并且锁被释放),内存中的文件和数据之间没有链接。 【参考方案1】:

“现在在 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 中打开了一个文件,并且没有为该名称的文件列出任何句柄。 p>

【讨论】:

【参考方案2】:

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

它不会 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;

        

【讨论】:

以上是关于检查未锁定的文件是不是打开的主要内容,如果未能解决你的问题,请参考以下文章

Powershell文件锁定功能未打开excel文件

检查文件是不是被进程文件句柄锁定

PHP检查文件是不是被flock()锁定?

如何以编程方式检查大写锁定是不是打开

如何检查文件是否被锁定(由其他应用程序打开)

你怎么知道 QMutex 是不是被锁定?