Przenoszenie pliku, gdy jest w użyciu - jak to działa?

31

Zauważyłem, że w systemach innych niż Windows .... tj. Linux / Mac mogę robić takie rzeczy jak: - Wyślij zip znajomemu ponad cel - Usuń plik, gdy jest w trakcie przesyłania

I transfer nie kończy się niepowodzeniem.

Lub mogę wykonać operacje takie jak ... - rozpocząć film - usunąć plik - film nadal jest odtwarzany do końca (odczyt z dysku, nie tylko buforowany w pamięci)

Chociaż pliki są „usuwane”, jak już wspomniałem, w rzeczywistości są przenoszone do innej lokalizacji w systemie plików ... tj. Do katalogu Kosz lub coś takiego. Wydaje mi się więc, że system operacyjny używa wskaźnika @ pliku, który jest aktualizowany, gdy się przesuwa, zamiast bezpośredniego dostępu do plików.

Czy ktoś może rzucić nieco światła na to, jak ta NIESAMOWITA funkcja jest rzeczywiście wdrażana? Nie jestem nawet pewien, co należy znaleźć w Google, aby dowiedzieć się więcej na ten temat.

Dziękuję Ci.

Mario Zigliotto
źródło
1
Teoretycznie przypuszczam, że są dwa sposoby, aby to się wydarzyło. Oba są rzeczywistością. Plik jest w pamięci. Lub system plików ma odniesienia do plików i tylko odwołanie jest usuwane. Oba są rzeczywistością. Odwoływanie się do faktów dotyczy tego, w jaki sposób programy cofające mogą usuwać rzeczy. Pomysł, że plik jest faktycznie usuwany, gdy wszystkie programy uzyskujące do niego dostęp zamykają się, brzmi jak nonsens. Możesz spojrzeć na powiązane listy (struktura danych programowania, aby lepiej zrozumieć pojęcie). Lub możesz sprawdzić konkretne systemy plików.
barlop

Odpowiedzi:

29

Pozycja katalogu jest tylko wskaźnikiem do i-węzła. I-węzeł zawiera meta-informacje o pliku (inne niż nazwa) i wskazuje dane pliku (jeśli istnieją). Kiedy zaczynasz kopiować plik, dostajesz uchwyt do i-węzła.

System operacyjny utrzymuje liczbę odwołań do i-węzła. Tak długo, jak istnieją odwołania do i-węzła, i-węzeł i dane pliku są przechowywane. Po usunięciu wszystkich odniesień do i-węzła, i-węzeł jest, a przestrzeń wymagana przez plik zostaje zwolniona.

Ponieważ plik jest otwarty do kopiowania, będzie on przechowywany do momentu zamknięcia pliku przez proces. Powinno to nastąpić po zakończeniu przesyłania pliku i nastąpi w przypadku niepowodzenia procesu kopiowania. Jeśli przesyłanie pliku nie powiedzie się w połowie i usunięte zostaną wszystkie twarde łącza do pliku, nie będzie można ponownie uruchomić transferu.

EDYCJA: Jak zauważyli inni, przenoszenie plików na tym samym urządzeniu odbywa się bez przenoszenia danych. Zamiast tego tworzony jest nowy wpis katalogu w katalogu docelowym, a oryginalny wpis katalogu jest usuwany.

Możliwe jest posiadanie wielu pozycji katalogu dla tego samego pliku. Są to tak zwane twarde linki. Są tworzone przez utworzenie nowej pozycji katalogu dla pliku bez usuwania oryginalnej pozycji. I-węzeł systemu plików ma liczbę odwołań do rejestrowania liczby pozycji katalogu wskazujących na plik.

EDYCJA 2: Jeśli proces ulegnie awarii lub zostanie zabity, plik zostanie całkowicie usunięty, ponieważ liczba dostępu do pamięci zostanie zmniejszona do zera. Jest to akcja, która ma miejsce, gdy program kończy się normalnie.

W przypadku awarii zasilania lub innego nieuporządkowanego zamknięcia systemu dysk będzie wymagał fsck(sprawdzenia systemu plików), zanim będzie można go w pełni zamontować. W zależności od stanu i-węzła i struktury katalogów na dysku przestrzeń zostanie odzyskana, plik pozostanie w katalogu lub zostanie utworzony nowy wpis w lost+foundkatalogu. Wyniki będą zależeć od tego, które zmiany zostały opróżnione na dysk lub zapisane w dzienniku systemów plików.

BillThor
źródło
5
Dokładnie. Sam nie mogłem tego lepiej ująć. Nawiasem mówiąc, powszechną sztuczką, jeśli potrzebujesz trochę miejsca na przechowywanie plików w programie, jest utworzenie pliku /tmpi natychmiastowe unlink(2). W tym momencie nie ma pliku w katalogu (więc nie ma nic do wyczyszczenia przy wyjściu lub awarii), ale twój proces nadal ma dostęp do pliku i żaden inny proces nie może przypadkowo lub celowo z nim zadzierać. To ilustruje interesującą właściwość.
Norman Gray,
Czy to oznacza, że ​​jeśli otwarty plik zostanie usunięty, gdy program go używa i nastąpi awaria zasilania, splątane dane pozostaną na dysku zajmującym miejsce? Co jeśli proces korzystający z pliku ulegnie awarii lub zostanie zabity?
Jason C,
1
@JasonC Zaktualizowałem odpowiedź, aby odpowiedzieć na twoje pytania.
BillThor,
6

Jak wyjaśnił Matt Jenkins, system operacyjny (system plików) śledzi pliki, które są otwarte przez aplikacje. Tak długo, jak proces utrzymuje plik otwarty, jego dane pozostają na dysku (nawet jeśli został on usunięty i nie jest już widoczny ani dostępny dla innych programów).

Zauważ, że konsekwencją tego jest to, że przestrzeń zajmowaną przez plik można odzyskać dopiero po zamknięciu go przez ostatni proces, który go używa. Oto często zadawane pytania dotyczące operacji na systemie plików Linux / Unix: „Polecenie„ df ”mówi, że partycja jest pełna, a„ du ”zgłasza wolne miejsce” (patrz np. Http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Jeśli potrzebujesz zwolnić miejsce, nie wystarczy usunąć duże pliki (np. Pliki dziennika), musisz także upewnić się, że żaden proces nie utrzymuje ich w stanie otwartym (zwykle problem z plikami dziennika).

Śleske
źródło
Nieprawda w przypadku OS X / HFS +: Możesz przenosić pliki, np. Do Kosza, ale nie między partycjami lub usuwać je (tj. Opróżniać Kosz).
Daniel Beck
2

To jest całkiem proste. Plik utrzymuje listę referencji - procesów, które uzyskują dostęp do pliku. Po usunięciu pliku po prostu usuwa on wpis z katalogu, ale nie sam plik. Programy, które nadal mają otwarty plik, nadal mogą uzyskać do niego dostęp. Plik jest faktycznie usuwany tylko wtedy, gdy wszystkie programy, które uzyskują do niego dostęp, zamykają go.

Ponadto przy przenoszeniu pliku - jeśli znajduje się w tym samym systemie plików - plik tak naprawdę się nie przesuwa, po prostu zmienia wskaźnik do katalogu, w którym znajduje się plik.

Majenko
źródło
„Plik zachowuje listę referencji”?
Daniel Beck
Powinien być „OS lub Explorer”, a nie plik.
Moab
2
W rzeczywistości byłby to system plików.
JRobert
System operacyjny używa systemu plików do przechowywania referencji w pliku (nlinks w strukturze nagłówka pliku) - tam - wszyscy jesteśmy szczęśliwi;)
Majenko
1
„Odwołania” to zarówno procesy z otwartym uchwytem do pliku, jak i twardymi dowiązaniami (w tym pierwszą nazwą pliku) do pliku. Bloki danych nie są oznaczone jako wolne i dostępne do ponownego użycia, dopóki liczba referencyjna nie spadnie do zera.
mpez0
0

W systemach plików unix plik może mieć jedno lub więcej twardych łączy do niego. Plik żyje, dopóki jest co najmniej jeden. Po usunięciu ostatniego miejsca miejsce w pliku zostaje zwolnione. powyższy link daje punkt wyjścia do dalszego czytania - szczególnie sekcja „Licznik linków”.

JRobert
źródło
1
To prawda, ale nie o to tu chodzi. Chodzi o to, że nawet po usunięciu ostatniego twardego łącza plik nadal pozostaje, dopóki wszystkie pociski nie zamkną dla nich uchwytów.
sleske