====== Verzeichnisse ======
Informationen über Verzeichnisse und deren Inhalt können über die Klasse ''QDir'' abgefragt werden. Um ein ''QDir''-Objekt zu einem bestimmten Verzeichnis zu erstellen, kann einfach der Pfad an den Konstruktor übergeben werden. Weiters können auch Verzeichnisse und ganze Pfade angelegt bzw. gelöscht werden.
===== Informationen lesen und schreiben =====
==== Verzeichnis auf Existenz prüfen ===
Über die Methode ''exists()'' kann abgefragt werden, ob das durch das ''QDir'' repräsentierte Verzeichnis tatsächlich existiert. Das folgende Programm prüft, ob ein per Kommandozeilenparameter übergebenes Verzeichnis existiert:
#include
#include
int main( int argc, char *argv[] )
{
if( argc < 2 )
{
std::cout << "Programm benoetigt Verzeichnisnamen als Parameter." << std::endl;
return 1;
}
QDir dir( argv[1] );
std::cout << dir.exists() << std::endl;
return 0;
}
==== Systeminformationen ====
''QDir'' bietet auch eine Reihe statischer Methoden um Systeminformationen abzufragen und zu ändern. Hier eine Übersicht der wichtigsten Methoden:
=== Aktuelles Verzeichnis ===
QDir current()
Gibt ein ''QDir''-Objekt für das aktuelle Anwendungsverzeichnis zurück.
QString currentPath()
Gibt den Pfad des aktuellen Anwendungsverzeichnisses zurück.
bool setCurrent( const QString& path )
**path:** Neues Anwendungsverzeichnis \\
**Return value:** Wahr bei Erfolg, ansonsten falsch\\
Setzt das Anwendungsverzeichnis auf ''path''.
=== Benutzerverzeichnis ===
QDir home()
Gibt ein ''QDir''-Objekt für das Benutzerverzeichnis zurück.
QString homePath()
Gibt den Pfad des Benutzerverzeichnisses zurück.
=== Trennzeichen ===
QChar separator()
Gibt das systemabhängige Trennzeichen für Pfade zurück. Unter Linux/Unix ist das '/', Windows hingegen verwendet '\'.
=== Verzeichnis für temporäre Dateien ===
QDir temp()
Gibt ein ''QDir''-Objekt für das temporäre Verzeichnis zurück.
QString tempPath()
Gibt den Pfad des temporären Verzeichnisses zurück.
==== Verzeichnis-Baum ====
Die folgenden Programme sollen einen Verzeichnis-Baum folgender Ordnerstruktur im Verzeichnis ''/home/user/'' ausgeben: \\
* Ordner: basedir
* Unterordner: A
* Unterordner: D
* Datei: D1
* Unterordner: E
* Datei: A1
* Datei: A2
* Datei: A3
* Unterordner: B
* Datei: B1
* Datei: B2
* Unterordner: C
* Unterordner: F
* Datei: F1
* Datei: F2
=== Iterator ===
Qt bietet einen fertigen Iterator der alle enthaltenen Dateien eines Verzeichnisses und dessen Unterverzeichnissen durchläuft.
// main.cpp
#include
#include
using namespace std;
int main( int argc, char *argv[] )
{
if( argc != 2 ) // Pfad zum Ordner muss als Kommandozeilenparameter übergeben werden
{
cout << "Programm benoetigt genau 1 Parameter." << endl;
return 1;
}
QDirIterator it( argv[1], QDirIterator::Subdirectories ); // Iterator für Verzeichnis erstellen
cout << "base directory: " << it.path().toStdString() << endl; // Grundverzeichnis ausgeben
it.next(); // nächstes Verzeichnis
do
{
// auf gültiges Verzeichnis prüfen
if( it.fileInfo().isDir() && it.fileName() != "." && it.fileName() != "..")
cout << "\tsubdirectory: " << it.fileName().toStdString() << endl;
else if( it.fileInfo().isFile() ) // prüfen ob es eine Datei ist
cout << "\t\tfile: " << it.fileName().toStdString () << endl;
it.next(); // nächste Datei bzw. Ordner
} while( it.hasNext() ); // Schleife läuft solange Dateien oder Ordner im Verzeichnis sind
return 0;
}
Ausgabe:
base directory: /home/user/basedir/
subdirectory: C
subdirectory: F
file: F2
file: F1
subdirectory: A
subdirectory: D
file: D1
file: A2
file: A3
file: A1
subdirectory: E
subdirectory: B
file: B1
file: B2
=== Rekursive Lösung ===
Oft ist es umständlich mit dem Iterator zu arbeiten. Wenn die Verzeichnisstruktur wichtig ist kann man rekursiv alle Unterordner und Dateien in einer Baumstruktur speichern.
// main.cpp
#include "Directory.h"
int main( int argc, char *argv[] )
{
if( argc != 2 ) // Pfad zum Ordner muss als Kommandozeilenparameter übergeben werden
{
cout << "Programm benoetigt einen Pfad als Parameter." << endl;
return 1;
}
Directory dir( argv[1] );
dir.print();
return 0;
}
// Directory.h
#ifndef DIRECTORY_H
#define DIRECTORY_H
#include
#include
#include
#include
using namespace std;
// Klasse für einen Ordner; enthält Listen mit Unterordner und Dateien
class Directory
{
public:
Directory( const QString& path ); // Konstruktor; Pfad zum Verzeichnis wird übergeben
~Directory ();
void print( int indention = 0 ); // gibt den Verzeichnis-Baum aus, Einzug wird übergeben
private:
QString m_path; // Pfad zum Verzeichnis
QList m_subdirs; // Liste mit Unterordnern
QList m_files; // Liste mit Dateien im Verzeichnis
int m_indention; // zusätzlicher Einzug je Einrückungsebene
void printIndention( int indention ); // Ausgabe des Einzugs
};
#endif
// Directory.cpp
#include "Directory.h"
Directory::Directory( const QString& path ) : m_path( path ) // Pfad speichern
{
m_indention = 4; // Standard-Einzug ist 4 Leerzeichen
QFileInfoList filelist = QDir( ( m_path ) ).entryInfoList(); // Liste mit Ordnerinhalt abrufen
for( int i = 0; i < filelist.size(); i++ )
{
// prüfen ob Eintrag ein gültiges Verzeichnis ist
if( filelist[i].isDir() && filelist[i].fileName() != "." && filelist[i].fileName() != ".." )
m_subdirs.push_back( new Directory( filelist[i].filePath() ) ); // Eintrag als Unterverzeichnis abspeichern
else if( filelist[i].isFile() ) // prüfen ob Eintrag eine Datei ist
m_files.push_back( filelist[i] ); // Info zur Datei in Liste abspeichern
}
}
Directory::~Directory()
{
while( m_subdirs.size() > 0 ) // Speicher für Unterverzeichnisse löschen
delete m_subdirs.takeFirst();
}
void Directory::print( int indention )
{
printIndention( indention ); // Einzug ausgeben
cout << m_path.toStdString() << endl; // Namen des Verzeichnisses ausgeben
indention += m_indention; // Einzug für Inhalt des Ordners erhöhen
for( int i = 0; i < m_files.size(); i++ ) // Dateien ausgeben
{
printIndention( indention );
cout << m_files[i].fileName().toStdString() << endl;
}
for( int i = 0; i < m_subdirs.size(); i++ )
m_subdirs[i]->print( indention ); // Aufruf dieser Funktion für alle Unterordner
}
void Directory::printIndention( int indention ) // gibt die übergebene Anzahl an Leerzeichen aus
{
for( int i = 0; i < indention; i++ )
cout << ' ';
}
Ausgabe:
/home/user/basedir/
/home/user/basedir/A
A1
A2
A3
/home/user/basedir/A/D
D1
/home/user/basedir/A/E
/home/user/basedir/B
B1
B2
/home/user/basedir/C
/home/user/basedir/C/F
F1
F2
===== Verzeichnisse erstellen und löschen =====
FIXME mkdir, rmdir, mkpath, rmpath