Perché le directory devono essere vuote prima di essere cancellate?

2

Per quanto ne so, l'eliminazione di una directory non vuota potrebbe funzionare allo stesso modo dell'eliminazione di una directory vuota: rimuovendo il puntatore ai metadati della directory non ci sarebbero puntatori agli elementi contenuti, eliminando in modo efficace tutti i suoi figli in modo ricorsivo .

Se ciò è vero, allora perché le directory devono essere vuote prima di essere eliminate? È solo una salvaguardia per impedire la cancellazione di molti file contemporaneamente o una limitazione tecnica di alcuni (possibilmente antichi) file system?

    
posta Diogo Kollross 15.04.2014 - 20:15
fonte

2 risposte

4

Molti file system funzionano con un sistema di conteggio dei riferimenti per i file.

~/foo$ ls -l
total 312
-rwxr-xr-x  2 shagie  staff  14884 Jan 24 10:35 a.out*
-rwxr-xr-x  1 shagie  staff    379 Apr 10 13:56 alias.pl*
-rw-r--r--@ 1 shagie  staff  14236 Apr 10 13:50 aliases.csv
-rwxr-xr-x  2 shagie  staff  14884 Jan 24 10:35 b.out*
-rw-r--r--  1 shagie  staff    137 Feb 17 15:30 f.pl
-rwxr-xr-x  1 shagie  staff    616 Mar 24 15:19 file*

Hai le autorizzazioni e poi il conteggio dei riferimenti. Nota che a.out e b.out sono lo stesso file. Una volta eliminati tutti i riferimenti a un file, è possibile recuperarli. Ma i file e le directory sono diversi.

In POSIX, hai i file che vengono rimossi da unlink, che li rimuove da una voce di directory.

The unlink function deletes the file name filename. If this is a file's sole name, the file itself is also deleted. (Actually, if any process has the file open when this happens, deletion is postponed until all processes have closed the file.)

E tu hai le directory che sono state rimosse con rmdir.

The rmdir function deletes a directory. The directory must be empty before it can be removed; in other words, it can only contain entries for . and ...

Questi sono controlli separati e rmdir non può rimuovere un file, né unlink può rimuovere una directory. Questo è solo il modo in cui funziona.

Questo rende il codice molto più semplice e meno messaggi di errore coinvolti. Una funzione fa una sola cosa. Da È corretto suddividere funzioni e metodi lunghi in quelli più piccoli anche se non verranno chiamati da nessun'altra parte?

If, when describing the activity of the code to another programmer you use the word 'and', the method needs to be split into at least one more part.

Affinché rmdir si comporti in questo modo, la descrizione sarà:

Remove the directory entry, and any files if any are contained within the directory.

Nota and . Rmdir non atomico significa che ci sono molte altre situazioni in cui un processo parziale potrebbe essere fatto senza dire chiaramente se è stato fatto o meno. Se premi file che non puoi eliminare come parte dell'ipotetico rmalldir è un successo? fallimento? quale messaggio di errore?

E così, ogni chiamata di funzione fa una sola cosa: rimuovere un file. rimuovere una directory. Qualsiasi errore è specificamente applicabile a tale operazione.

Il codice è più semplice e ci sono meno possibilità di errore in biblioteca o persone che usano la libreria.

    
risposta data 15.04.2014 - 20:32
fonte
0

Penso che sia principalmente per la tua protezione, per evitare di cancellare molti file che non intendi. Potresti potenzialmente avere un sacco di directory e directory di file sotto il livello superiore = uno, e non sapere particolarmente quando si lavora dalla riga di comando, che è dove questa convenzione è stata avviata prima che esistessero GUI. Inoltre, non c'è il concetto di un cestino Trask o Recycle disponibile per file e cartelle cancellati usando il comando rm.

Come qualcuno ha già fatto notare, è possibile aggirare questo comportamento su Linux e Unix fornendo un flag "-r" al comando remove, o addirittura mascherarlo facendo rm un alias per "rm -r".

Sui sistemi basati su GUI, è molto più facile vedere se ci sono cartelle o file sotto quello che stai per eliminare, inoltre puoi recuperare i file più facilmente.

Se si tenta di eliminare una cartella su Windows, si chiede prima (come fa per qualsiasi eliminazione), ma poi prosegue ed elimina la cartella e tutti i file e le cartelle sottostanti senza ulteriori richieste. Se commetti un errore, è piuttosto semplice ripristinare le cartelle / i file dal cestino.

    
risposta data 15.04.2014 - 23:44
fonte

Leggi altre domande sui tag