Windows imposta automaticamente il blocco file obbligatorio. UNIX imposta automaticamente il blocco manuale e cooperativo dei file. In entrambi i casi, i valori predefiniti possono essere sostituiti, ma in entrambi i casi in genere non lo sono.
Un sacco di vecchio codice di Windows utilizza l'API C / C ++ (funzioni simili fopen
) anziché l'API nativa (funzioni simili CreateFile
). L'API C / C ++ non ti dà modo di specificare come funzionerà il blocco obbligatorio, in modo da ottenere le impostazioni predefinite. La "modalità di condivisione" predefinita tende a proibire operazioni "in conflitto". Se si apre un file per la scrittura, si presume che le scritture siano in conflitto, anche se in realtà non si scrive mai nel file. Idem per i nomi.
Ed ecco dove peggiora. Oltre all'apertura per lettura o scrittura, l'API C / C ++ non fornisce alcun modo per specificare cosa si intende fare con il file. Quindi l'API deve presumere che eseguirai qualsiasi operazione legale. Poiché il blocco è obbligatorio, un oggetto open
che consente un'operazione in conflitto verrà rifiutato, anche se il codice non ha mai inteso eseguire l'operazione in conflitto ma stava semplicemente aprendo il file per un altro scopo.
Quindi, se il codice utilizza l'API C / C ++ o utilizza l'API nativa senza pensare specificamente a questi problemi, finiranno per impedire il massimo set di operazioni possibili per ogni file che aprono e non saranno in grado di aprire un file a meno di ogni possibile operazione che potrebbe eseguire su di esso una volta aperto non è in conflitto.
A mio avviso, il metodo Windows funzionerebbe molto meglio del metodo UNIX se ogni programma scegliesse le sue modalità di condivisione e le sue modalità di apertura gestendo i casi di errore in modo saggio e corretto. Il metodo UNIX, tuttavia, funziona meglio se il codice non si preoccupa di pensare a questi problemi. Sfortunatamente, l'API C / C ++ di base non si associa bene all'API dei file di Windows in un modo che gestisca le modalità di condivisione e si aprano bene i conflitti. Quindi il risultato netto è un po 'disordinato.