![]() |
Schnelle suche Filestream
Hallo zusammen,
ich habe folgendes Problem. Ich habe eine typisierte Datei mit folgenden Records.
Delphi-Quellcode:
In der typ. Datei kann somit das Filesystem zu einem bestimmten Zeitpunkt gespeichert werden. Ich suche jetzt die schnellste Möglichkeit für:
type TFldr = record
Name: ShortString; Count: Integer; // Anzahl Dateieinträge end; TFile = record Name: ShortString; Time: TFileTime; // Letzte Änderung der Datei end; - Ermitteln des Zeitstempels für eine Datei die in der Datei steht
Delphi-Quellcode:
- Hinzufügen einer Datei mit einem bestimmten Zeitstempel wenn diese noch nicht vorhanden ist.
function GetTimeStamp(Path, Filename: String; var Stamp: TFileTime): Boolean;
Delphi-Quellcode:
Probleme:
procedure AddStamp(Path, Filename: String; Stamp: TFileTime);
- Da die Datei sehr groß werden kann eignet sich ein Binärbaum nicht unbedingt, da dies zu lasten der Arbeitsspeichers geht - Direktes arbeiten mit dem FileStream ist nicht gerade schnell So jetzt bin ich mal auf eure Lösungsansätze gespannt. Danke im vorraus Baeuerle |
Re: Schnelle suche Filestream
Indem du wie eine Datenbank noch 'ne Indexdatei anlegst welche sortiert nach Zeitstempel die Einträge der Haupt-Datei wiederspiegelt.
|
Re: Schnelle suche Filestream
Ok, das heisst also folgendes:
Delphi-Quellcode:
Ich muss den (großen) Stream nur neu schreiben wenn Dateien hinzugefügt werden. Ansonsten muss in dem Indexfile nur an die entsprechende Stelle gesprungen werden und die Zeit neu gesetzt werden.
type TFldr = record
Name: ShortString; Count: Integer; end; type TFile = record Name: ShortString; ID_Stamp: Integer; // Index auf die Datei mit den Zeitstempeln end; Ist das so richtig verstanden??? |
Re: Schnelle suche Filestream
Wenn Du Daten änderst/löscht/hinzufügst mußt Du den Index aktualisieren (im schlechtesten Fall komplett neu schreiben).
Der Index hat folgende Infos: type TMyIndex = record ID_Stamp: Integer; // Index auf die Datei mit den Zeitstempeln Pos: Integer; // Position dieses Indexeintrags in der "Hauptdatei" end; Die Suche kannst du durchführen indem du mittels schnellen Suchalgorithmus (da ja sortiert ist) durchführen und wenns ganz schnelle sein muß hälst Du den Index im speicher. Findest Du einen Eintrag springst Du in deiner Typisierten Datei gleich an die passende Position. |
Re: Schnelle suche Filestream
So wie ich das jetzt verstehe kann ich mit dieser Indexdatei nach Zeitstempeln suchen. Ich möchte aber nach einem Pfad + Dateinamen suchen und dazu den Stempel als Ergebnis liefern!
Muss die Indexdatei dann über die Namen der Files laufen??? |
Re: Schnelle suche Filestream
Zitat:
|
Re: Schnelle suche Filestream
Ok, jetz nochmal die komplette Lösung:
3 Dateien: 1)Sortierete Datei mit Dateinamen: TFile = record Name: ShortString; ID_Fldr: Integer; // Position des Ordners ID_Stamp: Integer; // Position des Stamps end; 2) Datei mit Ordnernamen unsortiert TFldr = record Name: String; end; 3) Datei mit Zeitstempeln unsortiert TStamp = record Time: TFileTime; end; - Wenn ich jetzt nach einer Datei suche, suche ich zuerst den FilenName in 1) dann prüfe ich ob der Ordner korrekt ist, wenn nein zum nächsten Dateientrag. Ist der Ordner ok zum Stamp springen und diesen als Ergebnis liefern. - Hinzufügen - Wird die Datei gefunden, dann überschreiben des Stamps in 3 - Wird der Ordner gefunden, dann muss Datei 1 komplett neu geschrieben werden und in 3 ein neuer Eintrag angehängt werden - Wird nichts gefunden muss Datei 1 komplett neu geschrieben werden, in Datei 2,3 ein Eintrag hinzugefügt. Ist dass alles wirklich noch schnell ?? wenn ich so viel Prüfen bzw. neu schreiben muss??? Sorry, dass ich etwas nerve aber ich such nun mal eine sehr gute Lösung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz