Perché non posso cambiare il nome di un file che viene letto su Windows come posso fare su Linux / Mac?


23

Una delle cose che mi ha lasciato perplesso da quando ho iniziato a usare Linux è il fatto che ti permette di cambiare il nome di un file o addirittura di cancellarlo mentre viene letto. Un esempio è il modo in cui ho tentato accidentalmente di eliminare un video durante la riproduzione. Ci sono riuscito e sono rimasto sorpreso quando ho appreso che puoi cambiare qualsiasi cosa in un file senza preoccuparti se al momento viene utilizzato o meno.


2
Rinominare un file bloccato non è un problema su Windows. La cancellazione di solito è, ci sono pochi programmi che aprono un file con l'opzione FILE_SHARE_DELETE attivata.
Hans Passant,

In realtà non l'hai eliminato, l'hai semplicemente scollegato dalla directory in cui si trovava. Il file esiste ancora, potrebbe non avere alcun nome nel filesystem. (Sebbene abbia ancora un nome nel /procfilesystem attraverso il programma che lo ha aperto.) Un file può essere veramente cancellato solo se non ci sono riferimenti ad esso, e questo accade automaticamente.
David Schwartz,

Risposte:


36

Ogni volta che apri o esegui un file in Windows, Windows blocca il file in posizione (questa è una semplificazione, ma di solito vera.) Un file che è bloccato da un processo non può essere eliminato fino a quando quel processo non lo rilascia. Questo è il motivo per cui ogni volta che Windows deve aggiornarsi è necessario un riavvio affinché abbia effetto.

D'altra parte, i sistemi operativi simili a Unix come Linux e Mac OS X non bloccano il file ma piuttosto i settori del disco sottostante. Ciò può sembrare una banale differenziazione, ma significa che il record del file nel sommario del filesystem può essere eliminato senza disturbare nessun programma che abbia già il file aperto. Quindi è possibile eliminare un file mentre è ancora in esecuzione o comunque in uso e continuerà a esistere sul disco fino a quando alcuni processi hanno un handle aperto per esso anche se la sua voce nella tabella dei file è sparita.


2
Grazie per questa risposta Mi spiega molto di più la differenza. Inoltre aiuta a spiegare perché il caricamento di file / video di grandi dimensioni non occupa immense quantità di RAM. Altrimenti, la riproduzione di un video di grandi dimensioni potrebbe impantanare l'intero sistema.
Jerry Saravia,

4
Se hai eliminato un file in uso e desideri ripristinarlo su Linux, puoi trovare la voce del file in / proc, come descritto in questa domanda .
Ken Bloom,

2
Questo è in qualche modo una generalizzazione - non tutti gli aggiornamenti di Windows in questi giorni (su Windows 7) richiedono un riavvio, e su Linux ho fatto molto.
Alan B,

10

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 openche 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.


0

Questa è una domanda molto interessante e mi ha fatto pensare a una risposta praticabile. Spero che altri possano fornire backup qui.

Uso Windows e Linux e ho notato anche questo. Sono anche un utente di VIM. Vim leggerà un file di testo in un 'buffer', o nella RAM, e quindi non toccherà il file effettivo fino al salvataggio. Linux potrebbe eseguire questo tipo di azione in generale con tutti i file.

Prendi ad esempio il tuo video, legge il video, se possibile, tutto nella RAM, e poi hai una copia del video che è facilmente accessibile, cercabile, saltabile. Se il file è troppo grande, potresti riscontrare problemi perché Linux potrebbe non leggere l'intero video, forse solo un grosso pezzo. Quando il tuo lettore arriva alla fine del video bufferizzato, proverà a leggere nuovamente il file. Se hai eliminato il video, questo fa schifo per te.

Windows è un sistema operativo molto più sicuro in alcuni casi perché non ti consente di farlo. Potrebbe bufferizzare i file allo stesso modo di Linux, ma aggiunge anche il blocco dei file per impedire a te o ad altri programmi di alterare i file su cui stai lavorando o che stai visualizzando. Questo aiuta a mantenere intatto il file e impedisce a te o ad altri programmi di sovrascrivere le modifiche reciproche.


Non puoi effettivamente cancellarlo . Basta spostarlo e rinominarlo.
Daniel Beck

2
Puoi 'rm'. È abbastanza vicino per eliminarlo.
Chris Moore,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.