Decyzja o tym, czy wykonywany kod w pliku ma być zablokowany, czy nie, jest decyzją projektową, a MS po prostu zdecydowało się na blokadę, ponieważ ma to wyraźne zalety w praktyce: w ten sposób nie musisz wiedzieć, który kod, w jakiej wersji jest używany przez którą aplikację. Jest to poważny problem z domyślnym zachowaniem Linuksa, które jest po prostu ignorowane przez większość ludzi. Jeśli zastąpione zostaną biblioteki systemowe, nie będzie łatwo wiedzieć, które aplikacje używają kodu takich bibliotek. W większości przypadków najlepsze, co można uzyskać, to znajomość przez menedżera pakietów niektórych użytkowników tych bibliotek i ponowne ich uruchomienie. Ale to działa tylko w przypadku ogólnych i dobrze znanych rzeczy, takich jak może Postgres i jego biblioteki lub takie. Bardziej interesujące scenariusze dotyczą sytuacji, gdy tworzysz własną aplikację dla niektórych bibliotek innych firm, a te są zastępowane, ponieważ w większości przypadków menedżer pakietów po prostu nie zna Twojej aplikacji. I to' jest to nie tylko problem z natywnym kodem C lub tym podobnym, może się zdarzyć prawie ze wszystkim: po prostu użyj httpd z mod_perl i niektórymi bibliotekami Perla zainstalowanymi za pomocą menedżera pakietów i pozwól menedżerowi pakietów zaktualizować te biblioteki Perl z dowolnego powodu. Nie zrestartuje twojego httpd, po prostu dlatego, że nie zna zależności. Istnieje wiele przykładów takich jak ten, po prostu dlatego, że każdy plik może potencjalnie zawierać kod używany w pamięci przez dowolne środowisko uruchomieniowe, pomyśl o Javie, Pythonie i innych podobnych rzeczach.
Jest więc dobry powód, by sądzić, że domyślne blokowanie plików może być dobrym wyborem. Nie musisz jednak zgadzać się z tymi powodami.
Więc co zrobił SM? Po prostu stworzyli API, które daje aplikacji wywołującej szansę na podjęcie decyzji, czy pliki powinny być blokowane, czy nie, ale zdecydowali, że domyślną wartością tego API jest zapewnienie wyłącznej blokady dla pierwszej aplikacji wywołującej. Spójrz na interfejs API w okolicy CreateFile i jego dwShareMode
argument. To jest powód, dla którego możesz nie być w stanie usunąć plików używanych przez jakąś aplikację, po prostu nie dba o Twój przypadek użycia, używał wartości domyślnych i dlatego ma wyłączną blokadę pliku przez system Windows.
Proszę nie wierz w to, że ludzie mówią ci coś o systemie Windows, który nie korzysta z liczenia referencji na UCHWYTACH lub nie obsługuje Hardlinks lub podobnych, to jest całkowicie błędne. Prawie każde API używające HANDLEs dokumentuje swoje zachowanie dotyczące liczenia referencji i możesz łatwo przeczytać w prawie każdym artykule na temat NTFS, który faktycznie obsługuje Hardlinks i zawsze to robił. Od systemu Windows Vista obsługuje również łącza symboliczne, a obsługa łączy twardych została ulepszona poprzez udostępnienie interfejsów API do odczytu wszystkich tych dla danego pliku itp.
Dodatkowo możesz po prostu rzucić okiem na struktury używane do opisu pliku np. W Ext4 w porównaniu do tych w NTFS , które mają wiele wspólnego. Oba działają z koncepcją zakresów, która oddziela dane od atrybutów, takich jak nazwa pliku, a i-węzły to po prostu inna nazwa dla starszej, ale podobnej koncepcji. Nawet Wikipedia wymienia oba systemy plików w swoim artykule .
Jest naprawdę dużo FUD wokół blokowania plików w systemie Windows w porównaniu z innymi systemami operacyjnymi w sieci, podobnie jak w przypadku defragmentacji. Niektóre z tych FUD można wykluczyć, po prostu czytając trochę w Wikipedii .