Как проверить, снята ли блокировка на <service>.exe при удалении в C #? - PullRequest
2 голосов
/ 29 октября 2019

При попытке удалить приложение мы сначала пытаемся остановить службу и обеспечить успешное сообщение WaitForStatus. Затем мы удаляем их с помощью sc delete, но иногда не все файлы удаляются из установленной папки. Мы можем удалить их вручную, но через несколько секунд или около того, что тоже меняет ПК на другой ПК. Здесь мы считаем, что Windows удерживает / блокирует некоторые файлы (в основном, service.exe) и, следовательно, не может удалить их и все другие связанные файлы.

То, чего мы хотим достичь, это после того, как мы успешно удалили <service>.exe, мы хотим проверить (скажем, в цикле while), включена ли блокировка <service>.exe, если это так, спать в течение 2 секунда затем перепроверьте, пока он не освободится, а затем продолжите удаление файлов. Это может занять около 30 секунд, но, поскольку оно варьируется от компьютера к компьютеру, мы хотим быть устойчивыми, а не ждать случайным образом. Как мы можем проверить, заблокирован ли файл (service.exe)? Из моих исследований я не вижу прямого решения. Каждый предлагает проверить на file.Open (FileMode.Open, FileAccess.Read, FileShare.None). Это кажется ненужным. Есть ли прямое решение?

Ниже приведен мой код о том, как мы останавливаем и удаляем службу.

try
{
   service= new ServiceController(serviceName);
   service.Stop();
   service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
   service.Refresh();
   if (service.Status == ServiceControllerStatus.Stopped)
   {
        //runs command with sc delete 'servicename'
        return RunCommand("cmd.exe", "/c sc delete \"" + serviceName + "\"");
   }
}
catch()
{
 ...
}

1 Ответ

1 голос
/ 30 октября 2019

Для тех, кому это может быть интересно, поэтому мы решили эту проблему, пытаясь удалить service.exe в цикле while, повторяя попытки до его удаления. Мы спим в течение 1 секунды, прежде чем повторить попытку. Мы также должны ограничить количество повторных попыток, иначе мы можем в итоге заморозить удаление. Надеюсь, что это поможет кому-то с похожим вариантом использования

...