Einen Verzeichnisbaum mit Objekten nachbilden



  • Ich muss für ein Projekt einen existierenden Verzeichnisbaum einlesen, und programmintern mit
    Objekten repräsentieren. Hierbei muss es möglich sein:

    • ein zufälliges Objekt (Verzeichnis / Datei) auswählen
    • ein Objekt (Verzeichnis / Datei) in beliebiger Verzeichnistiefe hinzufügen
    • Alle Dateien / Unterverzeichnisse innerhalb eines Objekts (Verzeichnis) herauszufinden

    Hat jemand so etwas schon mal programmiert oder eine Idee, wie man so was elegant löst?

    Ich dachte zuerst eine Verschachtelte Objektstruktur:

    (jedes Verzeichnis wird von einem Objekt repräsentiert. Es enthält 2 Arrays, eines davon für Datei
    Objekte, das andere für weitere Verzeichnisobjekte, die wiederum 2 Arrays enthalten)
    Das kommt mir aber wenig elegant und übersichtlich vor.

    Meine zweite Idee wären mit Containern (multimap/multiset) aus der STL zu arbeiten

    • 1. Möglichkeit → es gibt nur ein Objekt, dass sowohl Datei als auch Verzeichnisse re-
      präsentieren kann. Dann könnte mit nur einem Container gearbeitet werden
    • 2. Möglichkeit → es gibt 2 Container, einen für Verzeichnisse, einen für Dateien

    Bei Containern habe ich noch keine Idee, wie ich den zufälligen Zugriff auf Elemente gestalten soll,
    ebenfalls fehlt mir die Idee, wie ich herausfinden kann, welche Dateien / Unterverzeichnisse ein Verzeichnis enthält.

    Ich bin für jeden Denkanstoß / für jede Idee dankbar!

    *Hintergrundinfo für die die es interessiert:
    ich muss ein Programm erstellen, welches die Konsistenz von Daten auf einem externen Datenträger unter
    Stressbedingungen über einen längeren Zeitraum überprüft. Hierzu werden zufällige Dateioperationen durch-
    geführt (delete( ), create( ), copy( ), truncate( ),….).

    Alle Dateien und Verzeichnisse werden in doppelter Ausführung (in zwei Verzeichnisbäumen) auf dem externen
    Datenträger angelegt/gelöscht/verschoben. Außerdem wird für jede Datei / jedes Verzeichnis ein Objekt ange-
    legt, dass als Referenz dient, um die Konsistenz der Daten überprüfen zu können.

    Nach ca. 1000 Dateioperationen werden die Verzeichnisbäume auf dem externen Datenträger erst miteinander,
    und dann mit den Referenzobjekten verglichen, um herauszufinden ob alle Daten noch korrekt sind. Jede
    Operation wird geloggt, und das Programm ist so aufgebaut, dass Durchläufe reproduzierbar sind weil alle Zufalls-
    werte durch einen Pseudo-Zufallsgenerator generiert werden, dessen Seed vorgegeben werden kann*



  • zitroneneis schrieb:

    Meine zweite Idee wären mit Containern (multimap/multiset) aus der STL zu arbeiten

    • 2. Möglichkeit → es gibt 2 Container, einen für Verzeichnisse, einen für Dateien

    Das klingt doch sehr gut! Evtl. werden dir einige zu einem kombinierten Container raten,
    aber das ist Geschmacksache

    zitroneneis schrieb:

    Bei Containern habe ich noch keine Idee, wie ich den zufälligen Zugriff auf Elemente gestalten soll,
    ebenfalls fehlt mir die Idee, wie ich herausfinden kann, welche Dateien / Unterverzeichnisse ein Verzeichnis enthält.

    Also ich schlag einfach mal boost vor:
    http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
    http://www.boost.org/doc/libs/1_43_0/libs/filesystem/example/simple_ls.cpp
    Jeder Knoten - sowohl Datei als auch Verzeichnis enthält dann ein fs::path Objekt

    Jetzt kommt es natürlich an wie du zufällig definierst...
    Ich würde es machen mit einer WK von 50% wähle eines der Verzeichnisse,
    WK von 40% ändere Datei, mit WK von 10% erstelle Datei.

    Also irgendwas in der Art... Wahrscheinlich solltest du die erste WK noch abhängig von der Tiefe machen...

    Gruß,
    CSpille



  • Danke erstmal für die schnelle Antwort, und die Tips.
    Ich werde mir das anschauen, und ausprobieren!

    Betreffend der Wahrscheinlichkeiten:

    es wird zuerst ausgewählt was für eine Operation durchgeführt werden soll:

    • *20% - Check()*→[File or Directory]
    • *8% - Create()*→[File or Directory]
    • *4% - Delete()*→[File or Directory]
    • *25% - Write()*→[File]
    • 25% - Read() →[File]
    • 2% - Truncate() →[File]
    • 12% - Copy() →[File]
    • 4% - Move() →[File]

    In der aufgerufenen Funktion wird dann aus dem Objektbaum eine zufällige Datei bzw.
    ein zufälliges Verzeichnis ausgewählt (keine vorgegebenen Wahrscheinlichkeiten), aber
    denke ich werde etwa 70% Dateien zu 30% Verzeichnisse wählen.

    Beispiel:
    Wird die Delete() Operation aufgerufen und es wird ein Verzeichnis
    gewählt, müssen alle Dateien und Unterverzeichnisse Rekursiv gelöscht
    werden (sowohl vom Datenträger als auch aus dem Objektbaum)

    Wird die Check() Operation aufgerufen und es wird eine Datei gewählt,
    wird nur dieses Objekt mit den Dateien auf dem externen Datenträger verglichen.



  • Klingt doch alles wunderbar!

    zitroneneis schrieb:

    In der aufgerufenen Funktion wird dann aus dem Objektbaum eine zufällige Datei bzw.
    ein zufälliges Verzeichnis ausgewählt (keine vorgegebenen Wahrscheinlichkeiten), aber
    denke ich werde etwa 70% Dateien zu 30% Verzeichnisse wählen.

    Wie wählst du denn aus dem Objektbaum zufällig eine Datei?
    Hast du in der Wurzel eine zusätzliche Liste mit allen Einträgen oder
    wie willst du sonst das 70% / 30% einhalten?



  • der Punkt ist noch offen, weil er von der Implementierung abhängig ist.

    Davon ausgehend, dass ich mit 2 multiset/multimap Containern arbeite würde,
    hatte hatte ich es mir so vorgestellt, dass die Klasse welche die Container
    kapselt hierzu 2 Methoden anbietet:

    • iterator getRandomFile();
    • iterator getRandomDirectory();

    Die Auswahl welche dieser Methoden aufgerufen wird erfolgt über ein gewichtetes
    random(), vom jeweiligen Operation-Objekt aus.

    Wie die Methoden arbeiten werden weiß ich noch nicht, weil ich noch
    nicht viel mit Containern gearbeitet habe und deswegen die Möglichkeiten
    nicht überblicken kann. Aber ich bin sicher, dass es einen Weg geben wird.


Anmelden zum Antworten