Все есть в названии, но более официально:
Почему Windows позволяет мне переименовывать работающий исполняемый файл, но не удаляет его?
Там действительно нет такой вещи, как переименование файла. Файл может иметь более одного имени или не иметь имени, поэтому вы переименовываете не файл, а запись каталога. Переименование - это операция над записью каталога, на которую не влияет тот факт, что файл заблокирован для выполнения.
dwShareMode
на ноль или использование флаговOF_SHARE_COMPAT
илиOF_SHARE_EXCLUSIVE
.Он не позволяет удалить исполняемый файл и библиотеки DLL, потому что Windows отображает части исполняемых файлов в память как часть процесса создания, поэтому файл нужен в течение всего времени существования процесса.
К сожалению, у меня нет истинной причины, почему он все еще позволяет переименовывать такие файлы. Я предполагаю, что это сделано для того, чтобы разрешить обновление dll и exe-файлов во время их работы, чтобы минимизировать время прерывания обслуживания.
В отличие от Linux (Unix в целом) позволяет удалить исполняемый файл во время его работы:
источник
Я предполагаю, что это потому, что имя - это просто атрибут того же двоичного содержимого файла, поэтому до тех пор, пока есть данные, дескриптор, содержащийся в запущенном процессе, не изменится.
источник