2013-02-07 32 views
17

Ho bisogno di cancellare tutti i file in una directory usando Qt.Elimina tutti i file in una directory

Tutti i file nella directory avranno l'estensione ".txt".

Non voglio cancellare la directory stessa.

Qualcuno sa come posso fare questo? Ho guardato QDir ma non ho avuto fortuna.

risposta

-3

È possibile ottenere ciò senza utilizzare Qt: per farlo, opendir, readdir, unlink e persino rmdir saranno i tuoi amici. È facile da usare, basta sfogliare le pagine man;).

+8

Ma voglio usare QT, come ho affermato nella domanda. – user1794021

1

Hai iniziato in senso positivo, guarda entryList e ovviamente passa il filtro del nome che desideri.

4

Chiama QDir :: entryList (QDir :: Files) per ottenere un elenco di tutti i file nella directory, quindi per ogni fileName che termina con ".txt" chiama QDir :: remove (fileName) per eliminare il file file.

0

Ecco come lo farei:

QString path = "name-of-directory"; 
QDir dir(path); 
dir.setNameFilters(QStringList() << "*.txt"); 
dir.setFilters(QDir::Files); 
while(dir.entryList().size() > 0){ 
    dir.remove(dir.entryList().first()); 
} 
+1

Ho provato con il tuo codice, ma cancella solo un file, e poi continua a funzionare nel ciclo fino a quando non si blocca ... – Pietro

+1

Hai ragione. Ottengo lo stesso risultato. Vergognimi per non averlo provato prima di postare. Luckilly rreeves ha pubblicato una correzione qui sotto. – Bjorn

+0

Sì, questo codice non funziona. Provoca loop infinito. – Joel

40

Bjorns risposta tweeked di non anello per sempre

QString path = "whatever"; 
QDir dir(path); 
dir.setNameFilters(QStringList() << "*.*"); 
dir.setFilter(QDir::Files); 
foreach(QString dirFile, dir.entryList()) 
{ 
    dir.remove(dirFile); 
} 
+3

Funziona come un fascino! :) – zeFree

+4

Questo dovrebbe essere contrassegnato come la risposta corretta :) – Joel

+0

C'è un motivo specifico per utilizzare il carattere jolly '" *. * "'? Se voglio cancellare TUTTI i file, un singolo asterisco (come questo "" * ") dovrebbe essere sufficiente, giusto? –

6

Ignorando il filtraggio estensione txt ... Ecco un modo per eliminare tutto nella cartella , tra cui sottodirectory non vuote:

In QT5, è possibile utilizzare removeRecursively() su dirs. Sfortunatamente, questo rimuove l'intera directory, piuttosto che semplicemente svuotarla. Qui è di base una funzione per cancellare solo i contenuti di una directory.

void clearDir(const QString path) 
{ 
    QDir dir(path); 

    dir.setFilter(QDir::NoDotAndDotDot | QDir::Files); 
    foreach(QString dirItem, dir.entryList()) 
     dir.remove(dirItem); 

    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs); 
    foreach(QString dirItem, dir.entryList()) 
    { 
     QDir subDir(dir.absoluteFilePath(dirItem)); 
     subDir.removeRecursively(); 
    } 
} 

In alternativa, è possibile utilizzare removeRecursively() sulla directory che si desidera cancellare (che eliminerebbe del tutto). Quindi, ricrealo con lo stesso nome dopo quello ... L'effetto sarebbe lo stesso, ma con meno righe di codice. Questa funzione più prolissa, tuttavia, fornisce un maggiore potenziale per la gestione dettagliata delle eccezioni da aggiungere se lo si desidera, ad es. rilevamento di violazioni di accesso su specifici file/cartelle ...

Problemi correlati