Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schnelle suche Filestream (https://www.delphipraxis.net/64942-schnelle-suche-filestream.html)

Baeuerle 10. Mär 2006 07:08


Schnelle suche Filestream
 
Hallo zusammen,

ich habe folgendes Problem. Ich habe eine typisierte Datei mit folgenden Records.

Delphi-Quellcode:
type TFldr = record
      Name: ShortString;
      Count: Integer; // Anzahl Dateieinträge
      end;

     TFile = record
      Name: ShortString;
      Time: TFileTime; // Letzte Änderung der Datei
      end;
In der typ. Datei kann somit das Filesystem zu einem bestimmten Zeitpunkt gespeichert werden. Ich suche jetzt die schnellste Möglichkeit für:

- Ermitteln des Zeitstempels für eine Datei die in der Datei steht
Delphi-Quellcode:
function GetTimeStamp(Path, Filename: String; var Stamp: TFileTime): Boolean;
- Hinzufügen einer Datei mit einem bestimmten Zeitstempel wenn diese noch nicht vorhanden ist.
Delphi-Quellcode:
procedure AddStamp(Path, Filename: String; Stamp: TFileTime);
Probleme:
- 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

Bernhard Geyer 10. Mär 2006 07:10

Re: Schnelle suche Filestream
 
Indem du wie eine Datenbank noch 'ne Indexdatei anlegst welche sortiert nach Zeitstempel die Einträge der Haupt-Datei wiederspiegelt.

Baeuerle 10. Mär 2006 07:23

Re: Schnelle suche Filestream
 
Ok, das heisst also folgendes:
Delphi-Quellcode:
type TFldr = record
      Name: ShortString;
      Count: Integer;
     end;

type TFile = record
      Name: ShortString;
      ID_Stamp: Integer; // Index auf die Datei mit den Zeitstempeln
     end;
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.

Ist das so richtig verstanden???

Bernhard Geyer 10. Mär 2006 07:32

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.

Baeuerle 10. Mär 2006 07:58

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???

Luckie 10. Mär 2006 08:04

Re: Schnelle suche Filestream
 
Zitat:

Zitat von Baeuerle
Muss die Indexdatei dann über die Namen der Files laufen???

Jupp. So ist es.

Baeuerle 10. Mär 2006 08:17

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 03:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz