检查未锁定的文件是不是打开
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;
【讨论】:
以上是关于检查未锁定的文件是不是打开的主要内容,如果未能解决你的问题,请参考以下文章