#c_sharp #winforms #файлы #webbrowser
Написал такой метод для удаления файлов public static void deleteFile(params string[] fileName) { foreach (string f in fileName) { if (File.Exists(Properties.Settings.Default.diskString + f)) File.Delete(Properties.Settings.Default.diskString + f); } } Вызываю так: HelpClass.deleteFile("poster.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", downloadFileName); Вот эти файлы, перечисленные в аргументах метода, предварительно вставляются в поля сайта через webbrowser. Соответственно, при запуске метода файлы якобы удаляются, но на самом деле остаются до полного закрытия программы. Прикрепил скрин, как они на диске выглядят после этого. Если попытаться их открыть, то пишет, что отсутствует разрешение на доступ к расположению файла. Если же в webbrowser их не вставлять, то все хорошо удаляется. Пытался очищать память при закрытии второй формы (событие FormClosed), на которой находится webbrowser, двумя способами: this.Dispose(); и GG.Collect(); результата нет. Один раз сработал второй способ, но больше почему-то не работает)) Файлы в поля на сайте вставляются следующим образом: Populate().ContinueWith((_) => { }, TaskScheduler.FromCurrentSynchronizationContext()); async Task PopulateInputFile_poster(HtmlElement file_poster) { file_poster.Focus(); dialog show up var sendKeyTask = Task.Delay(500).ContinueWith((_) => { SendKeys.Send(Properties.Settings.Default.diskString + "" + "poster.jpg" + "{ENTER}"); }, TaskScheduler.FromCurrentSynchronizationContext()); file_poster.InvokeMember("Click"); await sendKeyTask; await Task.Delay(500); } async Task Populate() { var elements = webBrowser1.Document.GetElementsByTagName("input"); //постер foreach (HtmlElement file_poster in elements) { if (file_poster.GetAttribute("name") == "screen") { file_poster.Focus(); await PopulateInputFile_poster(file_poster); } } } Подскажите, что не так?
Ответы
Ответ 1
Нашел похожую проблему вот тут Там говорится, что если перейти на произвольный адрес, например, http://localhost/ , то ресурсы освобождаются и могут быть удалены. В этом вопросе так же сталкиваются с этой проблемой и предлагают такое же решение: webBrowser.Navigate("about:blank"); while (webBrowser.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); File.Delete(fileName); Если это не поможет, то можно подойти радикально, используя AppDomain: Создаете класс наследник от MarshalByRefObject Оборачиваете этот класс вокруг webbrowser Создаете новый домен В этом домене создаете объект вашего класса Взаимодействуете с браузером через него Когда хотите удалить файлы, выгружаете домен целиком Как вариант, еще можно попробовать стороннюю библиотеку CefSharp . Она является альтернативой webbrowser на хромиуме.
Комментариев нет:
Отправить комментарий