Проблема такая:
Есть 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, чтобы определить, завершился ли процесс.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Каким образом возможно передать массиву Intermediate_Cpp[3] класса Course{}; ,который в свою очередь является объектом этого класса,объекты student1, student2,...
При использовании одной в двух обьектах работает только один, второй отказываетсяИгра Кораблики , функция начинает игру и используется в двух...
Если у меня есть header-only библиотека и есть xxxConfigcmake, я делаю find_package(xxx CONFIG REQUIRED)