![](/img/trans.png)
[英]“SaveAs” Wordprocessingdocument (Open XML) file is locked
[英]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.