某些程序(图像程序,如Paint,文本编辑器,如记事本和Wordpad等)打开文件,将内容加载到内存中,然后释放文件锁。有没有办法告诉程序是否正在使用该文件,即使它没有被锁定?
例如,即使在Paint中打开了image1.bmp,我的程序也可以覆盖磁盘上的image1.bmp副本,因为该文件未被锁定。现在,在Paint中打开的image1.bmp副本与磁盘上的image1.bmp副本不同。
我的程序是用C#编写的。我通常使用此方法来检查文件是否被锁定,但在上述情况下它不起作用。 Is there a way to check if a file is in use?
有没有解决方案?
答案 0 :(得分:0)
"现在在Paint" 中打开的image1.bmp的副本 - 这是你的错误 - 文件不再在Paint中打开。它被打开,读取,然后关闭。 Paint根本不打开文件 - 它只在RAM内存中有一个COPY内容。换句话说 - 你在MS Paint中看到一张图片的事实并不意味着该文件是开放的。
这与将某个文件借给某人相当,然后他制作了一份复印件并将其归还 - 该人不再“#34;持有"该文件,他有一份单独的副本。而且,仅通过查看文档就无法知道谁可能在历史的某个时刻复制过它。
另一种表达方式是伪代码:
File file = Open("image.png");
Image img = ImageFromFile(file);
file.Close();
...
img.Save("image.png");
这里根本没有打开文件,只有RAM内容的副本。
注意:我实际检查过,对于Paint - Process Explorer可以显示打开的句柄,我在Paint中打开了一个文件,并且没有为该名称的文件列出的句柄。
答案 1 :(得分:0)
这是我想出的。我检查窗口标题的所有打开过程。如果进程有一个窗口标题,我看它是否包含我正在寻找的文件的名称。
由于某些应用程序可以在一个实例中打开多个文件,因此它不会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;
}