Для этого вам понадобится PInvoke. MoveFileEx имеет возможность запланировать удаление файла при следующей перезагрузке.
Если dwFlags определяет MOVEFILE_DELAY_UNTIL_REBOOT и lpNewFileName является NULL, MoveFileEx регистрирует файл lpExistingFileName быть удалены, когда система перезагружается.
Что-то вроде:
[return: MarshalAs (UnmanagedType.Bool)]
[DllImport ("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, int dwFlags);
public static bool ScheduleDelete (string fileFullName) {
if (!File.Exists (fileFullName))
throw new InvalidOperationException ("File does not exist.");
return MoveFileEx (fileFullName, null, 0x04); //MOVEFILE_DELAY_UNTIL_REBOOT = 0x04
}
Спасибо! отлично работает ... никогда бы не подумал об этом , но есть ли способ удалить его прямо сейчас? Я знаю, что есть деинсталляторы, которые делают именно это! – Nissim
Возможно, этот деинсталлятор выполняет какой-то другой движок, а не сам движок. Например, если у вас есть msi, он выполняется установщиком Windows, который фактически является другим приложением, поэтому он может удалить msi. Но в вашем случае это сам двигатель. Удаление заблокированного файла (любой файл, а не только EXE), возможно, будет файловой системой ... – Hemant