Dlaczego nie mogę zmienić nazwy pliku odczytywanego w systemie Windows, tak jak mogę to zrobić w systemie Linux / Mac?

23

Jedną z rzeczy, które mnie intrygowały, odkąd zacząłem używać Linuksa, jest fakt, że pozwala on zmienić nazwę pliku, a nawet usunąć go podczas odczytu. Przykładem jest przypadkowa próba usunięcia filmu podczas jego odtwarzania. Udało mi się i byłem zaskoczony, gdy dowiedziałem się, że możesz zmienić prawie wszystko w pliku bez względu na to, czy jest on używany w tej chwili, czy nie.

the_midget_17
źródło
2
Zmiana nazwy zablokowanego pliku nie stanowi problemu w systemie Windows. Zwykle usuwanie polega na tym, że niewiele programów otwiera plik z włączoną opcją FILE_SHARE_DELETE.
Hans Passant,
Tak naprawdę go nie usunąłeś, po prostu odłączyłeś go od katalogu, w którym był. Plik nadal istnieje, po prostu może nie mieć żadnej nazwy w systemie plików. (Chociaż nadal ma nazwę w /procsystemie plików za pośrednictwem programu, który go otworzył). Plik można naprawdę usunąć tylko wtedy, gdy nie ma do niego żadnych odniesień, a dzieje się to automatycznie.
David Schwartz,

Odpowiedzi:

36

Za każdym razem, gdy otwierasz lub uruchamiasz plik w systemie Windows, system Windows blokuje plik na miejscu (jest to uproszczenie, ale zwykle jest to prawda). Pliku zablokowanego przez proces nie można usunąć, dopóki ten proces go nie zwolni. Dlatego za każdym razem, gdy system Windows musi się zaktualizować, konieczne jest ponowne uruchomienie komputera, aby zadziałało.

Z drugiej strony, systemy operacyjne uniksopodobne, takie jak Linux i Mac OS X, nie blokują pliku, a raczej bazowe sektory dysku. Może się to wydawać trywialnym różnicowaniem, ale oznacza, że ​​rekord pliku w spisie treści systemu plików można usunąć bez zakłócania działania jakiegokolwiek programu, który już ma otwarty plik. Możesz więc usunąć plik, gdy jest on w trakcie wykonywania lub w inny sposób używany i będzie istniał na dysku, dopóki jakiś proces ma do niego otwarty uchwyt, nawet jeśli jego wpis w tabeli plików zniknął.

Andrew Lambert
źródło
2
Dziękuję za tę odpowiedź. To wyjaśnia mi znacznie więcej. Pomaga również wyjaśnić, dlaczego ładowanie dużych plików / filmów nie zajmuje ogromnej ilości pamięci RAM. W przeciwnym razie odtwarzanie jednego dużego wideo może doprowadzić do awarii całego systemu.
Jerry Saravia,
4
Jeśli usunąłeś używany plik i chciałeś go odzyskać w systemie Linux, możesz znaleźć wpis pliku w / proc, jak opisano w tym pytaniu .
Ken Bloom
2
Jest to trochę uogólnienie - nie wszystkie aktualizacje systemu Windows w dzisiejszych czasach (w systemie Windows 7) wymagają ponownego uruchomienia, a zrobiłem wiele na Linuksie, które tak zrobiły.
Alan B
10

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, openktó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.

David Schwartz
źródło
0

To bardzo interesujące pytanie, które skłoniło mnie do zastanowienia się nad realną odpowiedzią. Mam nadzieję, że inni mogą zapewnić tutaj kopię zapasową.

Korzystam zarówno z systemu Windows, jak i Linux, i również to zauważyłem. Jestem także użytkownikiem vim. Vim wczyta plik tekstowy do „bufora” lub pamięci RAM, a następnie nie dotknie rzeczywistego pliku, dopóki go nie zapiszesz. Linux może wykonywać takie działania w ogóle ze wszystkimi plikami.

Weźmy na przykład film, odczytuje on film, jeśli to możliwe, do pamięci RAM, a następnie masz kopię wideo, która jest łatwo dostępna, możliwa do wyświetlenia, możliwa do przejścia. Jeśli plik jest zbyt duży, możesz napotkać problemy, ponieważ Linux może nie odczytać całego wideo, a może po prostu dużej części. Gdy odtwarzacz dotrze do końca buforowanego wideo, spróbuje ponownie odczytać plik. Jeśli usunąłeś film, to jest do bani.

Windows jest w niektórych przypadkach znacznie „bezpieczniejszym” systemem operacyjnym, ponieważ nie pozwala na to. Może buforować pliki w taki sam sposób jak Linux, ale dodaje także blokowanie plików, aby uniemożliwić Tobie lub innym programom zmianę plików, nad którymi pracujesz lub które przeglądasz. Pomaga to utrzymać plik w nienaruszonym stanie i chroni Ciebie lub inne programy przed wzajemnym nadpisywaniem zmian.

Jerry Saravia
źródło
Nie można go faktycznie usunąć . Po prostu przenieś go i zmień jego nazwę.
Daniel Beck
2
Możesz to zrobić. To wystarczająco blisko, aby go usunąć.
Chris Moore,