При попытке удалить приложение мы сначала пытаемся остановить службу и обеспечить успешное сообщение 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()
{
...
}