2.11.2. Mit Verzeichnissen und Dateien umgehen

Lernziele

Funktionen aus file.h

LEDA bietet einige Hilfsfunktionen an, die es erlauben, bequem und plattformunabhängig durch Verzeichnisse zu wandern und Informationen zu den sich dort befindenden Dateien zu besorgen. Diese Funktionen sind in der Header-Datei file.h deklariert.

Das folgende Programm benutzt einige dieser Funktionen, um vom aktuellen Verzeichnis aus mittels einer Funktion visit_directory() rekursiv alle Unterverzeichnisse zu durchwandern und die Namen aller darin enthaltenen Dateien und deren Größe auszugeben. Um die Baumstruktur der Verzeichnisse zu verdeutlichen, gibt die rekursive Funktion vor jedem Dateinamen eine Anzahl von Leerzeichen aus, die mit der Rekursionstiefe wächst.

Filename: FileBrowser.C
#include <LEDA/file.h>
#include <LEDA/list.h>
#include <LEDA/string.h>
#include <iostream>

using leda::get_files;
using leda::size_of_file;
using leda::get_directories;

using leda::list;
using leda::string;
using std::cout;

void visit_directory(const string& new_dir, const string& padding="") 
{
  set_directory(new_dir);

  string f;
  list<string>  files_in_dir = get_files(".");
  forall(f, files_in_dir) 
    cout << padding << f << " " << size_of_file(f) << "\n";
  

  list<string> dirs_in_dir(get_directories("."));
  string dir;
  forall(dir, dirs_in_dir) 
    if(dir != "."  && dir != "..") {
      cout << padding << dir << "/\n";
      visit_directory(dir, padding + "  ");
    }
}


int main()
{
  visit_directory(".");
}

Unsere Funktion visit_directory() stellt sich zunächst mittels

set_directory(dir);

in das ihr übergebene Verzeichnis dir. Danach listet sie alle darin enthaltenen Dateien mit Hilfe von

get_files(dir);

auf. Die Dateigröße einer bestimmten Datei f erhält sie durch

size_of_file(f);

get_directories(dir);

werden danach alle vom aktuellen Verzeichnis ausgehenden Verzeichnisse bestimmt. Zu dieser Liste gehört auch das Vaterverzeichnis und ein Verweis auf das aktuelle Verzeichnis selbst. Diese Verzeichnisse können plattformunabhängig als .. bzw. . angesprochen werden; für sie darf kein rekursiver Aufruf mehr erfolgen.

Weitere Informationen

In file.h sind noch einige weitere nützliche Funktionen deklariert; sie erlauben es z. B., Verzeichnisse zu erzeugen oder Dateien zu löschen. Mehr Informationen zu diesen Funktionen findet man auf der entsprechenden Manualseite.