Чому я не можу змінити ім'я файлу, який читається в Windows, як це можна зробити в Linux / Mac?


23

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


2
Перейменування блокованого файлу не є проблемою для Windows. Як правило, видаляється мало програм, які відкривають файл із увімкненою опцією FILE_SHARE_DELETE.
Ганс Пасант

Ви насправді не видалили його, ви просто від’єднали його від каталогу, в якому він був. Файл все ще існує, він просто не може мати імені у файловій системі. (Хоча він все ще має ім’я у /procфайловій системі через програму, яка відкрила його.) Файл можна видалити справді лише тоді, коли на нього не залишилося жодних посилань, і це відбувається автоматично.
Девід Шварц

Відповіді:


36

Щоразу, коли ви відкриваєте або виконуєте файл у Windows, Windows блокує файл на місці (це спрощення, але зазвичай це правда.) Файл, який заблокований процесом, не можна видалити, поки цей процес не звільнить його. Ось чому кожного разу, коли Windows має оновитись, для її вступу в силу потрібна перезавантаження.

З іншого боку, Unix-подібні операційні системи, такі як Linux та Mac OS X, не блокують файл, а лише основні сектори диска. Це може здатися тривіальною диференціацією, але це означає, що запис файлу з вмісту файлової системи можна видалити, не порушуючи жодної програми, у якій файл уже відкритий. Таким чином, ви можете видалити файл, поки він все ще виконується або використовується іншим способом, і він буде існувати на диску до тих пір, поки якийсь процес має відкриту ручку для нього, хоча його запис у таблицю файлів відсутній.


2
Дякую за цю відповідь. Це пояснює мені різницю набагато більше. Це також допомагає пояснити, чому завантаження великих файлів / відео не займає величезну кількість оперативної пам’яті. В іншому випадку відтворення одного великого відео може зашкодити всій вашій системі.
Джеррі Саравія

4
Якщо ви видалили файл, який використовувався, і хочете повернути його в Linux, ви можете знайти запис файлу в / proc, як описано в цьому запитанні .
Кен Блум

2
Це дещо узагальнення - не всі оновлення Windows за ці дні (для Windows 7) потребують перезавантаження, і я багато зробив на Linux, що це робив.
Алан Б

10

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

Багато старих кодів Windows використовує API C / C ++ (подібні функції fopen), а не рідний API (такі функції CreateFile). API C / C ++ не дає можливості вказати, як буде працювати обов'язкове блокування, тож ви отримаєте значення за замовчуванням. За замовчуванням "режим спільного використання", як правило, забороняє "конфліктувати" операції. Якщо ви відкриєте файл для запису, записи вважаються конфліктними, навіть якщо ви ніколи насправді не пишете у файл. Дітто для перейменувань.

І ось, де стає гірше. Крім відкривання для читання або запису, API C / C ++ не дає можливості вказати, що ви маєте намір робити з файлом. Таким чином, API повинен припускати, що ви будете виконувати будь-яку юридичну операцію. Оскільки блокування є обов'язковим, то, openщо дозволяє конфліктувати операцію, буде відмовлено, навіть якщо код ніколи не мав наміру виконувати конфліктуючу операцію, а лише відкривав файл з іншою метою.

Отже, якщо код використовує API C / C ++ або використовує нативний API, не замислюючись над цими проблемами, вони закінчуються, запобігаючи максимальному набору можливих операцій для кожного файлу, який вони відкривають, і неможливо відкрити файл, якщо всі можливі операції вони могла виконувати на ній раз відкриття безконфліктно.

На мою думку, метод Windows працював би набагато краще, ніж метод UNIX, якби кожна програма вибирала свої режими спільного використання та відкриті режими розумно та справедливо обробляла випадки відмов. Однак метод UNIX працює краще, якщо код не заважає думати про ці проблеми. На жаль, базовий API C / C ++ не відображається добре на API файлу Windows таким чином, що обробляє режими спільного використання та конфліктує. Тож чистий результат трохи заплутаний.


0

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

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

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

Windows в деяких випадках набагато безпечніша ОС, оскільки вона не дозволить вам це зробити. Він може завантажувати файли так само, як Linux, але також додає блокування файлів, щоб запобігти вам чи іншим програмам змінювати файли, над якими ви працюєте чи переглядаєте. Це допомагає зберегти файл недоторканим і не дає вам чи іншим програмам перезаписати зміни один одного.


Фактично його не можна видалити . Просто перемістіть його та перейменуйте.
Даніель Бек

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