Возможным решением было бы объединение наблюдателя файловой системы с некоторым опросом,
получать уведомления за каждое изменение в файле, а при получении уведомления проверять, является ли оно
заблокировано, как указано в принятом в настоящее время ответе: https://stackoverflow.com/a/50800/6754146
Код для открытия файлового потока скопирован из ответа и немного изменен:
public static void CheckFileLock(string directory, string filename, Func<Task> callBack)
{
var watcher = new FileSystemWatcher(directory, filename);
FileSystemEventHandler check =
async (sender, eArgs) =>
{
string fullPath = Path.Combine(directory, filename);
try
{
// Attempt to open the file exclusively.
using (FileStream fs = new FileStream(fullPath,
FileMode.Open, FileAccess.ReadWrite,
FileShare.None, 100))
{
fs.ReadByte();
watcher.EnableRaisingEvents = false;
// If we got this far the file is ready
}
watcher.Dispose();
await callBack();
}
catch (IOException) { }
};
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.IncludeSubdirectories = false;
watcher.EnableRaisingEvents = true;
//Attach the checking to the changed method,
//on every change it gets checked once
watcher.Changed += check;
//Initially do a check for the case it is already released
check(null, null);
}
Таким образом, вы можете проверить файл, если он заблокирован, и получать уведомления при его закрытии по указанному обратному вызову, таким образом вы избегаете слишком агрессивного опроса и выполняете работу только тогда, когда он действительно может быть закрыт