Чому я можу перейменувати запущений виконуваний файл, але не видалити його?


12

Все в назві, але офіційно:

Чому Windows дозволяє мені перейменувати запущений виконуваний файл, але не видалити його?

Відповіді:


12

Дійсно не існує такого поняття, як перейменування файлу. У файлі може бути більше одного імені або без імені, тому перейменування ви не перейменований, а запис у каталозі. Перейменування - це операція над записом каталогу, на яку не впливає той факт, що файл заблокований для виконання.


2
Хм, чому тоді спроба перейменувати звичайний файл, відкритий для читання чи запису, не вдається?
Серж

5
@Serge: Тому що процес, який відкрив файл, спеціально попросив його вийти з ладу, встановивши відповідні відкриті прапори.
Девід Шварц

які конкретні відкриті прапори?
n611x007

2
Швидше за все, встановлення dwShareModeнуля або використання прапорів OF_SHARE_COMPATабо OF_SHARE_EXCLUSIVE.
Девід Шварц

6

Це не дозволяє видалити виконуваний файл та DLL, оскільки Windows відображає частини виконуваних файлів у пам'ять як частину створення процесу, тому він потребує цього файлу впродовж життя.

На жаль, у мене немає справжньої причини, чому вона все ще дозволяє перейменувати такі файли. Я думаю, що це робиться для того, щоб дозволити оновлення файлів dlls та exe під час їх запуску, щоб мінімізувати час переривання служби.

На противагу цьому Linux (unix взагалі) дозволяє видалити виконуваний файл під час його роботи:

tmp]$ cp /usr/bin/md5sum .;ll md5*; \
(./md5sum /home/pub/iso/FC5/FC-5-i386-DVD.iso & ); \
rm md5sum ; ll md5*;ps -f
-rwxr-xr-x 1 sergey sergey 37276 Oct 16 02:38 md5sum
ls: cannot access md5*: No such file or directory
UID        PID  PPID  C STIME TTY          TIME CMD
sergey    2423  2422  0 02:32 pts/1    00:00:00 -bash
sergey    2533     1  0 02:38 pts/1    00:00:00 ./md5sum /home/pub/iso/FC5/FC-5-
sergey    2536  2423  0 02:38 pts/1    00:00:00 ps -f

Зауважте, що, наприклад, Linux також відображає частини виконуваних файлів у пам'ять, але не має жодних проблем, що дозволяють видалити запущений виконуваний файл.
ChrisInEdmonton

2
@ChrisInEdmonton Так, але це я пояснив тут: unix.stackexchange.com/questions/49299/…
Серж

Серж, приємне пояснення там. :)
ChrisInEdmonton

Linux не дозволить вам видалити файл під час його виконання. Однак ви можете видалити записи каталогів, оскільки вони не виконуються.
Девід Шварц

@DavidSchwartz, будь ласка, дивіться оновлення моєї відповіді. Linux дозволяє мені від’єднати будь-який файл, який виконується, за умови, що у мене достатньо дозволів на видалення цього файлу.
Серж

2

Я думаю, це тому, що ім'я є лише атрибутом того ж бінарного вмісту файлу, так що, поки дані є, ручка, утримувана запущеним процесом, не зміниться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.