Проблема такая:
Есть program.exe. Он увидел, что вышло обновление и по указанной ссылке скачал новую версию program 1.0.0.1.exe и updater 1.0.0.1.exe. Папка с программой находится в документах пользователя.
Теперь program.exe запускает updater 1.0.0.1.exe через Process.Start.
Сам updater 1.0.0.1.exe убивает процесс program.exe так:
Process[] ps1 = System.Diagnostics.Process.GetProcessesByName("program"); //Имя процесса.
foreach (Process p1 in ps1)
{
p1.Kill();
}
Теперь он удаляет все *.exe файлы в папке, кроме новых (которые только что скачались):
string _dir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)+"\\Documents\\Program";//AppDomain.CurrentDomain.BaseDirectory;
string _del = @"*.exe";
string[] _files = Directory.GetFiles(_dir, _del);
foreach (string fl in _files)
{
if (fl.Contains("Program " + ProgramVersion + ".exe") || fl.Contains("updater " + ProgramVersion + ".exe"))
{
continue;
}
else
{
File.SetAttributes(fl, FileAttributes.Normal);
File.Delete(fl);
Console.Write(fl + " deleted.\n");
}
}
Затем нужно переименовать новый файл program 1.0.0.1.exe в program.exe
File.Move(_dir+"\\Program " + ProgramVersion + ".exe", _dir+"\\Program.exe");
теперь запускаем получившийся program.exe и убиваем наш updater 1.0.0.1.exe
System.Diagnostics.Process.Start(_dir+"\\Program.exe");//Это запуск
System.Diagnostics.Process.GetCurrentProcess().Kill();
Что тут странного?
Через InstallMaker я создал установочник. Он просто копирует файлы в папку Program в документах пользователя и создаёт ярлык на рабочем столе.
Папка Program почему-то с аттрибутом Read-only (и никак его не изменить). Новые программы тутда скачиваются. Если запустить updater сразу после компиляции или из студии - то всё работает отлично. Но вот если я скачаю обновления через сервер (всё как я описывал), то не поняно почему вдруг, возникает исключение в окне консоли:
Unhandled Exception: System.UnauthorizedAccessException: Access to the path 'C:\Users\Admin\Documents\Program\updater 1.0.0.1.exe' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalDelete(String path, Boolean checkHost)
at System.IO.File.Delete(String path)
at updater.Program.Main(String[] args)
Я не могу посмотреть точно, где спотыкается программа, потому что во время отладки ошибок просто нет. Как это лечить? До нового года всё работало (правда не было переименования файла и удаления старых версий. Просто было скачивание и запуск).
Я пробовал запуск от админа (и первой программы и отдельно второй) - результата нет.
Танцы с аттрибутами ничего не дали.
Директории менял, т.е. и с полным путём пробовал и просто с указание файлов (всё находится в одной папке).
На стеке уже просматривал подобные случаи, мне не помогло.
Может сам Windows перестал "доверять" скаченым программам? Как вообще тогда делают обновления? Может есть какая-то специальная папка, которая "не контролируется" так жёстко? Тип туда свсё скачать, переименовать и готовое перекопировать в рабочую папку?
Я просто в шоке =(
Судя по вашему стеку, проблема в File.Delete(fl); и, скорее всего в том, что процесс ещё запущен, когда вы выполняете удаление, что приводит к исключению. Суть в том, что метод Kill асинхронный.
Из документации:
Метод Kill выполняется асинхронно. После вызова метода Kill вызовите метод WaitForExit, чтобы дождаться завершения процесса, или проверьте свойство HasExited, чтобы определить, завершился ли процесс.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости