Domyślnym systemem Windows jest automatyczne, obowiązkowe blokowanie plików. W systemie UNIX domyślnie występuje ręczne, kooperatywne blokowanie plików. W obu przypadkach wartości domyślne mogą zostać zastąpione, ale w obu przypadkach zwykle nie są.
Wiele starych kodów Windows używa API C / C ++ (funkcje jak fopen
) zamiast natywnego API (funkcje jak CreateFile
). Interfejs API C / C ++ nie pozwala określić sposobu działania obowiązkowego blokowania, więc otrzymujesz wartości domyślne. Domyślny „tryb udostępniania” zabrania „sprzecznych” operacji. Jeśli otworzysz plik do zapisu, zakłada się, że zapisy powodują konflikt, nawet jeśli tak naprawdę nigdy nie zapisujesz do pliku. To samo dotyczy nazw.
I tutaj jest coraz gorzej. Poza otwieraniem do odczytu lub zapisu, interfejs API C / C ++ nie pozwala określić, co zamierzasz zrobić z plikiem. Dlatego interfejs API musi zakładać, że wykonasz dowolną operację prawną. Ponieważ blokowanie jest obowiązkowe, polecenie, open
które pozwala na działanie w konflikcie, zostanie odrzucone, nawet jeśli kod nigdy nie zamierzał wykonać konfliktu, ale po prostu otwierał plik w innym celu.
Jeśli więc kod korzysta z interfejsu API C / C ++ lub korzysta z natywnego interfejsu API bez konkretnego myślenia o tych problemach, zostaną one zamknięte, uniemożliwiając maksymalny zestaw możliwych operacji dla każdego otwieranego pliku i niemożność otwarcia pliku, chyba że każda możliwa operacja może działać na nim, gdy otwarty jest nie jest sprzeczny.
Moim zdaniem metoda Windows działałaby znacznie lepiej niż metoda UNIX, gdyby każdy program wybrał tryby udostępniania i tryby otwarte mądrze i rozsądnie obsługiwał przypadki awarii. Metoda UNIX działa jednak lepiej, jeśli kod nie zawraca sobie głowy tymi problemami. Niestety, podstawowy interfejs API C / C ++ nie jest dobrze mapowany na interfejs API plików systemu Windows w sposób, który obsługuje tryby udostępniania, a konflikt otwiera się dobrze. Wynik netto jest więc nieco niechlujny.