Verzeichnis löschen mit QDir geht nicht richtig

Alles rund um die Programmierung mit Qt
Antworten
Teetrinker
Beiträge: 37
Registriert: 21. Mai 2008 21:07

Verzeichnis löschen mit QDir geht nicht richtig

Beitrag 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.:

Code: Alles auswählen

|-Hauptverzeichnis
 |-Unterordner
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.
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Re: Verzeichnis löschen mit QDir geht nicht richtig

Beitrag 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
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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.
Teetrinker
Beiträge: 37
Registriert: 21. Mai 2008 21:07

Beitrag 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.
Antworten