Dateien

Die Klasse QFile ermöglicht einfachen Zugriff auf Dateien auf der Festplatte. Über QDataStream (für Binärdaten) und QTextStream (für Text) ist sie ähnlich zu verwenden wie gewöhnliche C++-Filestreams. Weitere Informationen wie Berechtigungen und Pfadinformationen können durch QFileInfo abgefragt werden. Statische Methoden von QFileDialog stellen Auswahldialoge zur Verfügung. Da ihre Funktionalität zu umfangreich und größtenteils selbsterklärend ist möchte ich hier ausdrücklich auf die Dokumentation verweisen.

Beispiele

Datei anlegen und Text hineinschreiben

#include <QFile>
#include <QTextStream>
#include <iostream>
 
using namespace std;
 
int main ()
{
 
  QFile file ("datei.txt");
 
  if (!file.open (QIODevice::WriteOnly))        // Datei anlegen und auf Fehler prüfen
  {
    cout << "Datei konnte nicht angelegt werden: " << file.errorString ().toStdString () << endl;
    return 1;
  }
 
  QTextStream stream (&file);                   // Stream für die Datei öffnen
 
  stream << "Dieser Text steht nun in der Datei.\n";  // Text in die Datei schreiben
  stream << "Das ist die zweite Zeile.\n";
  stream << "Noch eine Zahl: " << 123;
 
  return 0;
 
}

Inhalt der Datei „datei.txt“:

Dieser Text steht nun in der Datei.
Das ist die zweite Zeile.
Noch eine Zahl: 123

Datei anlegen und binäre Daten hineinschreiben

#include <QFile>
#include <QDataStream>
#include <ctime>
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main ()
{
 
  QFile file ("datei.txt");
 
  if (!file.open (QIODevice::WriteOnly))      // Datei erstellen
  {
    cout << "Datei konnte nicht angelegt werden: " << file.errorString ().toStdString () << endl;
    return 1;
  }
 
  srand (time (NULL));                        // Zufallsgenerator initialisieren
 
  QDataStream stream (&file);
 
  for (int i = 0; i < 10; i++)
    stream << rand () % 100;                  // Zufallszahlen von 0-99 in die Datei schreiben
 
  return 0;
 
}

Zur Ausgabe des Inhalts kann das folgende Beispiel verwendet werden.

vorgegebene Datei einlesen und binären Inhalt ausgeben

#include <QFile>
#include <QDataStream>
#include <iostream>
 
using namespace std;
 
int main ()
{
 
  QFile file ("datei.txt");
 
  if (!file.open (QIODevice::ReadOnly))
  {
    cout << "Datei konnte nicht angelegt werden: " << file.errorString ().toStdString () << endl;
    return 1;
  }
 
  QDataStream stream (&file);
  int nr;
 
  for (int i = 0; i < 10; i++)
  {
    stream >> nr;                // Zahl aus der Datei einlesen
    cout << nr << endl;          // Zahl ausgeben
  }
 
  return 0;
 
}

Datei kopieren mit Auswahl über GUI

Um grafische Objekte wie einen Dateiauswahldialog anzeigen zu können muss eine QApplication-Instanz erzeugt werden. Andernfalls erhält man einen Laufzeitfehler.

#include <QApplication>
#include <QFile>
#include <QFileDialog>
#include <iostream>
 
using namespace std;
 
int main (int argc, char *argv[])
{
 
  QApplication app (argc, argv);
  QString srcpath = QFileDialog::getOpenFileName (NULL, "Quelle ausswaehlen"),   // Quelle auswählen
          destpath = QFileDialog::getSaveFileName (NULL, "Ziel auswaehlen");     // Ziel auswählen
 
  if (srcpath.isNull () || destpath.isNull ())              // prüfen ob die Auswahl einer Datei abgebrochen wurde
    return 1;
 
  QFile src (srcpath);                                      // Dateiobjekt für Quelle erstellen
 
  if (!src.copy (destpath))                                 // kopieren und auf eventuelle Fehler überprüfen
  {
    cout << "Fehler beim Kopieren: " << src.errorString ().toStdString () << endl;
    return 1;
  }
 
  return 0;
 
}

Dateiinformationen ausgeben

#include <QApplication>
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QDateTime>
#include <iostream>
 
using namespace std;
 
int main (int argc, char *argv[])
{
 
  QApplication app (argc, argv);
  QString filepath = QFileDialog::getOpenFileName (NULL, "Datei ausswaehlen");
 
  if (filepath.isNull ())
    return 1;
 
  QFileInfo fileinfo (filepath);         // FileInfo-Objekt für die Datei erstellen
 
  // verschiedene Informationen der Datei ausgeben
  cout << "Information zur Datei \"" << fileinfo.fileName ().toStdString () << "\":" << endl
       << "\tabsoluter Pfad: " << fileinfo.absolutePath ().toStdString () << endl
       << "\tDateiendung: " << fileinfo.completeSuffix ().toStdString () << endl
       << "\tErstelldatum: " << fileinfo.created ().toString ().toStdString () << endl
       << "\tausfuehrbar: " << (fileinfo.isExecutable () ? "ja" : "nein") << endl
       << "\tversteckt: " << (fileinfo.isHidden () ? "ja" : "nein") << endl
       << "\tBesitzer: " << fileinfo.owner ().toStdString () << endl
       << "\tGruppe: " << fileinfo.group ().toStdString () << endl;
 
  return 0;
 
}

Mögliche Ausgabe:

Information zur Datei ".bash_history":
	absoluter Pfad: /home/daniel
	Erstelldatum: Mi. Apr 28 13:48:01 2010
	ausfuehrbar: nein
	versteckt: ja
	Besitzer: daniel
	Gruppe: daniel