Как разрешить исключение System.Unauthorized access? - PullRequest
3 голосов
/ 04 ноября 2011

Я добавил средство обновления для приложения (Myapp.exe). Когда я запускаю Myapp.exe , он проверяет новую доступную версию и загружает ее в соответствии с инструкцией пользователя в каталог Windows Temp . После загрузки обновления в каталог Temp запускается новая программа replacer.exe , которая отвечает за получение Myapp.exe , завершение процесса, удаление Myapp.exe и скопируйте новую версию (Myapp.exe) из каталога Temp в старый путь Myapp.exe. replacer.exe имеет следующий код.

class Program
    {
        static void Main(string[] args)
        {
            try
            {                       
                Process myProcess = Process.GetProcessesByName("Myapp")[0];    
                myProcess.Kill();
                File.Delete(args[0]);
                File.Copy(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\Myapp.exe", args[0], false);

            }
            catch (Exception e)
            {
                Console.Write(e.ToString() + "");
                //return;
            }               
            //Console.Write( "Success");
            try
            {
                Process.Start(args[0]);
            }
            catch (Exception es) 
            {
                Console.Write(es.ToString() + "");
                //return;
            }
            Console.ReadLine();
        }
    }

Но replacer.exe не может удалить Myapp.exe и выдать исключение System.UnauthorizedAccessException . Это означает, что replacer.exe не может получить доступ к пути, указанному Myapp.exe при удалении Myapp.exe. Примечание: я запустил UserAccount, Myapp.exe и replacer.exe от имени администратора и обычного пользователя. Как я могу решить это. Пожалуйста, помогите мне. Заранее спасибо. , .

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Для завершения процесса требуется некоторое время: Process.Kill() просто сообщает о завершении процесса, но не хочет, чтобы он действительно завершился.

Вы захотите ввести цикл с небольшой задержкой и проверить, действительно ли процесс завершен.

Используйте свойство Process.HasExited, чтобы проверить это: документация по MSDN здесь: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited.aspx.

1 голос
/ 04 ноября 2011

Вы действительно проверили содержимое args[0]?File.Delete не просто выбрасывает UnauthorizedAccessException, если ему не хватает необходимых разрешений;он также может быть выдан, если путь ведет к каталогу или файлу, доступному только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...