В Windows по умолчанию установлена автоматическая обязательная блокировка файлов. В UNIX по умолчанию используется ручная кооперативная блокировка файлов. В обоих случаях значения по умолчанию могут быть переопределены, но в обоих случаях обычно нет.
Большая часть старого кода 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 таким образом, что обрабатывает режимы совместного использования и конфликты открываются хорошо. Таким образом, чистый результат немного грязный.