Как освободить файл, заблокированный filesystemwatcher?
Я использую
FileSystemWatcher
чтобы вызвать событие при редактировании файла изображения в Paint и обновить с его помощью элемент управления preview image. Но установив файл в качестве источника во второй раз, он выдает ошибку, потому что файл все еще используется другим процессом. Итак, я обнаружил, что это происходит из-за FileSystemWatcher
.Что я уже пробовал:
private void btnEdit_Click(object sender, RoutedEventArgs e) { if (!File.Exists(lastImage)) return; FileSystemWatcher izleyici = new FileSystemWatcher(System.IO.Path.GetDirectoryName( lastImage), System.IO.Path.GetFileName(lastImage)); izleyici.Changed += izleyici_Changed; izleyici.NotifyFilter = NotifyFilters.LastWrite; izleyici.EnableRaisingEvents = true; ProcessStartInfo info = new ProcessStartInfo(); info.FileName = lastImage; info.Verb = "edit"; Process.Start(info); } void izleyici_Changed(object sender, FileSystemEventArgs e) { //I want to add code here to release the file. Dispose() not worked for me setImageSource(lastImage); } void setImageSource(string file) { var bitmap = new BitmapImage(); using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read)) { bitmap.BeginInit(); bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.StreamSource = stream; bitmap.EndInit(); } ssreview.Source = bitmap; }
В этом коде я хочу освободить файл перед обновлением "образа". Я попробовал избавиться, но это не сработало. Как я могу это сделать?
Philippe Mori
Я тоже думаю, что винить в этом нет особого смысла FileSystemWatcher
за твои проблемы.
Однако, судя по вашему коду, вы никогда не отсоединяете обработчик событий, что явно неправильно. Почти в любом случае вы присоединяете обработчик к событию, вы также должны отсоединить его в какой-то момент. Таким образом, кажется, что ваш код плохо разработан.
Amt-Coder
Я был прав в одном пункте, что проблема заключалась в самом FileSystemWatcher,но я ошибся в файле FSW locks. Я нашел решение, задав его в stackoverflow. Проблема в том, что FSW вызывает события не в пользовательском интерфейсе. Поэтому его нужно вызвать. Пожалуйста, смотрите здесь