C# Unhandled Exception: System.UnauthorizedAccessException: Access to the path

105
22 февраля 2022, 02:00

Проблема такая:

Есть 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 перестал "доверять" скаченым программам? Как вообще тогда делают обновления? Может есть какая-то специальная папка, которая "не контролируется" так жёстко? Тип туда свсё скачать, переименовать и готовое перекопировать в рабочую папку?

Я просто в шоке =(

Answer 1

Судя по вашему стеку, проблема в File.Delete(fl); и, скорее всего в том, что процесс ещё запущен, когда вы выполняете удаление, что приводит к исключению. Суть в том, что метод Kill асинхронный.

Из документации:

Метод Kill выполняется асинхронно. После вызова метода Kill вызовите метод WaitForExit, чтобы дождаться завершения процесса, или проверьте свойство HasExited, чтобы определить, завершился ли процесс.

READ ALSO
Работа с классами,объекты

Работа с классами,объекты

Каким образом возможно передать массиву Intermediate_Cpp[3] класса Course{}; ,который в свою очередь является объектом этого класса,объекты student1, student2,...

104
Проблема с использование функции в двух обьектах C++

Проблема с использование функции в двух обьектах C++

При использовании одной в двух обьектах работает только один, второй отказываетсяИгра Кораблики , функция начинает игру и используется в двух...

91
cmake config mode

cmake config mode

Если у меня есть header-only библиотека и есть xxxConfigcmake, я делаю find_package(xxx CONFIG REQUIRED)

107
Программа для поиска анаграмм С++

Программа для поиска анаграмм С++

Дано слово и словарьСловарь должен быть задан файлом *txt

75