AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelle suche Filestream

Ein Thema von Baeuerle · begonnen am 10. Mär 2006 · letzter Beitrag vom 10. Mär 2006
Antwort Antwort
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#1

Schnelle suche Filestream

  Alt 10. Mär 2006, 08:08
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
function GetTimeStamp(Path, Filename: String; var Stamp: TFileTime): Boolean; - Hinzufügen einer Datei mit einem bestimmten Zeitstempel wenn diese noch nicht vorhanden ist.
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 08:10
Indem du wie eine Datenbank noch 'ne Indexdatei anlegst welche sortiert nach Zeitstempel die Einträge der Haupt-Datei wiederspiegelt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 08:23
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???
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 08:32
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 08:58
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???
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 09:04
Zitat von Baeuerle:
Muss die Indexdatei dann über die Namen der Files laufen???
Jupp. So ist es.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Baeuerle

Registriert seit: 17. Mär 2005
Ort: Ettenheim
283 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Schnelle suche Filestream

  Alt 10. Mär 2006, 09:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 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