【发布时间】:2013-05-23 17:46:58
【问题描述】:
我编写了程序并且需要我自己的文件观察器(检查文件是否可以打开的循环)。像这样的:
while (loadedFiles.Count > 0 || isNeedReRead)
{
Thread.Sleep(1000);
if (isNeedReRead)
ReadFromRegistry();
foreach (var file in loadedFiles)
{
if (!IsFileLocked(file.Value))
{
// logic
}
}
}
来源:Is there a way to check if a file is in use?
这是我的解决方案:
try
{
using (Stream stream = new FileStream(
path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
stream.Close();
return false;
}
}
catch (IOException)
{
return true;
}
它适用于 Word、Excel。但是如果进程没有锁定文件,这种方法就没有帮助。例如,如果打开的位图文件正在更改,IsFileLocked 返回 false。
有什么想法吗?
【问题讨论】:
-
如果文件更改可以接受,是否会收到通知?如果是这样,您可以使用 System.IO.FileSystemWatcher 类。
-
这有什么用?即使您检查文件是否可以打开,也不能保证在您实际尝试打开它时仍然可以打开它,即使它是下一行代码。您仍然需要将文件访问权限封装在
try-catch中。 -
我无法使用 FileSystemWatcher。它在文件更改时通知。我需要 OnClosed 通知。我的程序包含一些文件。当我打开其中一些时,我的观察者开始运行。当文件关闭时,如果需要,观察者会更新它。但我可以在关闭文件之前关闭程序。在这种情况下,watcher 在程序加载时启动并检查所有以前打开的文件。如果此文件未打开,则它已更新。