Seite 1 von 1
Verzeichnis löschen mit QDir geht nicht richtig
Verfasst: 30. April 2009 16:10
von Teetrinker
Ich bin gerade dabei ein Programm zu schreiben, das auch Verzeichnisse und deren Inhalte löschen kann. Da Qt keinerlei Funktionen dafür bereitstellt, lese ich den Inhalt mit QDirIterator aus und lösche jede Datei einzeln. Danach beinhaltet der Ordner maximal nur noch Unterordner, aber keine Dateien mehr, also z.B.:
Wenn ich nun das Hauptverzeichnis mit rmdir oder rmpath löschen möchte, passiert gar nichts so lange wie das Hauptverzeichnis nicht komplett leer ist. Aber rmpath müsste doch das Hauptverzeichnis samt Unterordner löschen können, wenn alles leer ist oder habe ich da was falsch verstanden? Oder ist das eventuell ein Bug in Qt 4.51 (Linux)?
Btw: gibts eigentlich einen logischen Grund warum solche essentiellen Sachen wie Verzeichnisse löschen, kopieren, verschieben nicht von Qt abgedeckt werden? Unter KDE gibts solche Komfortmethoden.
Re: Verzeichnis löschen mit QDir geht nicht richtig
Verfasst: 3. Mai 2009 09:32
von Troll.Soft
Teetrinker hat geschrieben:
Btw: gibts eigentlich einen logischen Grund warum solche essentiellen Sachen wie Verzeichnisse löschen, kopieren, verschieben nicht von Qt abgedeckt werden? Unter KDE gibts solche Komfortmethoden.
Hallo Teetrinker, hier spricht Kaffeetrinker.
Ich weiß auch nicht was Qt sich dabei denkt und bin empört auf Boost umgestiegen (Nur für Datei-Operationen) Boost hat für diesen Zweck ein bisschen mehr drauf, dafür allerdings eine scheußliche Doku, die man auch noch finden muß. Boost benutzt Exceptions um simple Statusinformationen zu liefern. Habe extra eine eigene Klasse geschrieben, um wieder auf normale Returnwerte zurückzufallen. Wenn eine Datei blockiert wird, verweigert Boost das Löschen. Das konnte ich mal über Perl. Ist leider ein paar Jahre her und ich weiß nicht mehr wo im CPan ich das gefunden habe.
Langer Rede kurzer Sinn, Du mußt wohl oder übel Deine eigene Routine schreiben.
tschüß
der TrollSoft
Verfasst: 3. Mai 2009 13:50
von FaS
Z.B. so:
Code: Alles auswählen
bool rmdirRecursive( const QString &dirName_ )
{
QDir dir( dirName_ );
dir.makeAbsolute();
QString dirName = dir.path();
QStringList list = dir.entryList( QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot );
QFileInfo fileInfo;
QString absoluteItem;
for( int i = 0; i < list.size(); i++ )
{
absoluteItem = dirName + "/" + list.at(i);
fileInfo.setFile( absoluteItem );
if( fileInfo.isDir() )
rmdirRecursive( absoluteItem );
else
QFile::remove( absoluteItem );
}
dir.cdUp();
return dir.rmdir( dirName );
}
PS: rmpath entfernt einen einfachen Pfad, nicht einen Baum oder Pfad mit Fransen oder wie auch immer man das nennen mag. rmpath("a/b/c") entfernt c wenn c leer, dann b wenn b leer usw. und hört auf, sobald diese Bedingung nicht mehr zutrifft.
Verfasst: 4. Mai 2009 19:48
von Teetrinker
Danke für eure Rückmeldungen. Ich habe bereits mit QDirIterator eine Routine geschrieben, die Verzeichnisse löschen kann. Allerdings echt schade, dass Qt das nicht von aus aus kann.
FaS hat geschrieben:Z.B. so:
PS: rmpath entfernt einen einfachen Pfad, nicht einen Baum oder Pfad mit Fransen oder wie auch immer man das nennen mag. rmpath("a/b/c") entfernt c wenn c leer, dann b wenn b leer usw. und hört auf, sobald diese Bedingung nicht mehr zutrifft.
Das würde einiges erklären. Danke.