检查未锁定的文件是否已打开
某些程序(图像程序,如Paint,文本编辑器(如记事本和写字板等))打开文件,将内容加载到内存中,然后释放文件锁定。 有没有办法判断一个程序是否在使用该文件,即使它没有被锁定?
例如,即使在Paint中打开image1.bmp,我的程序也可以覆盖磁盘上image1.bmp的副本,因为该文件未被锁定。 现在,在Paint中打开的image1.bmp的副本与磁盘上的image1.bmp的副本不同。
我的程序是用C#编写的。 我通常使用这种方法来检查文件是否被锁定,但在上述情况下不起作用。 有没有办法检查一个文件是否在使用?
有没有解决这个问题的方法?
“现在在Paint中打开的image1.bmp的副本” - 这是您的错误 - 该文件不再在Paint中打开。 它被打开,阅读,然后关闭。 Paint并没有保持文件打开 - 它只在RAM内存中拥有COPY的内容。 换句话说 - 在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;
}
链接地址: http://www.djcxy.com/p/40557.html