Amt-Coder Ответов: 1

Как освободить файл, заблокированный 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 вызывает события не в пользовательском интерфейсе. Поэтому его нужно вызвать. Пожалуйста, смотрите здесь

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Учитывая, что FileSystemWatcher не имеет ничего общего с самими файлами и не может их заблокировать, мне интересно, как вы определили, что именно FileSystemWatcher вызывает проблему?

FileSystemWatcher не сообщает вам, когда файл закрывается процессом его записи. Он только сообщает вам, когда меняется время "последней записи файла". Это может измениться во время записи файла несколько раз. Это зависит от вас, чтобы попытаться открыть файл для эксклюзивного чтения в попытке прочитать содержимое. Если эта попытка не удалась, то вы немного подождете и попробуете снова.


Amt-Coder

Я думал, что проблема в FSW, потому что я удалил часть кода для FSW, и поэтому в то время не было никаких проблем. Вот в чем причина. Но я ошибся насчет файла блокировки. Решение таково здесь если вы хотите взглянуть.

Dave Kreskowiak

Это очень мило. Вы вообще ничего не упомянули о потоковой передаче в своем приложении. Если бы это был ты, ответ был бы очевиден.