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 таким чином, що обробляє режими спільного використання та конфліктує. Тож чистий результат трохи заплутаний.