Я написал программу и нуждаюсь в моем собственном наблюдателе файлов (цикл, который проверяет, можно ли открыть файл). Что-то вроде этого:Как проверить, открыт ли файл?
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». – JosephHirn
Я не могу использовать FileSystemWatcher. Он уведомляет, когда файл изменен. Мне нужно уведомление OnClosed. Моя программа содержит некоторые файлы. И когда я открываю некоторые из них, мой наблюдатель начинает бежать. Когда файл закрыт, наблюдатель обновляет его, если это необходимо. Но я могу закрыть программу перед закрытым файлом. В этом случае наблюдатель запускается при загрузке программы и проверяет все ранее открытые файлы. Если этот файл не открывается, он обновляется. – Max