Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   2 Listen durchwühlen (https://www.delphipraxis.net/61008-2-listen-durchwuehlen.html)

wicht 15. Jan 2006 19:30


2 Listen durchwühlen
 
Hallo!

Zuersteinmal möchte ich sagen, dass dieses Forum hier ganz klasse ist. Bei Fragen über Google hat mir die Delphi-PRAXiS schon oft weitergeholfen, deswegen habe ich mich jetzt mal angemeldet und starte direkt mit einer Frage.

Mein Programm dient dazu, Dateien aus Ordnern zu bewerten, Kommentare dazu abzulegen und so weiter. Diese Informationen werden in Records in einer TList gehalten, beim Programmstart geladen, beim Beenden gespeichert.
Startet der Benutzer das Programm das erste Mal, sind noch keine Daten gespeichert, das bedeutet, dass das Programm vom Benutzer angegebene Ordner einließt (erstellt Records nur mit Informationen Verzeichnis/Dateiname).
Dann kann der Benutzer mit dem Programm arbeiten und seine Informationen den Records hinzufügen.

Wenn er nun das Programm beendet und neustartet, ließt es erst aus der Datei, die die Records enthält, alle Datensätze ein (nur Ordner und Datei oder eben nach Bearbeitung durch Benutzer Ordner, Datei, Kommentar, Bewertung etc). Weil das Programm aber immer auf dem neusten Stand, was den Inhalt der angegebenen Ordner betrifft, sein muss, ließt es nach dem Lesen der Datei alle Ordner nocheinmal ein, wie bei dem ersten Programmstart, und vergleicht den Inhalt der Records aus der Datei mit der aktuellen, neu gelesenen Ordner/Dateistruktur.

Das funktioniert alles wie gewünscht, nur ist es leider verdammt langsam :( ... Wenn 20.000 Dateien vorhanden sind und ich diese 20.000 dann gegen die neu eingelesenen abgleiche (sind dann ja auch ca. 20.000), kann das verdammt lange dauern. Weil es eben auch nur ein kleines Tool ist, sind solche Wartezeiten wirklich niemandem zuzumuten. Ich habe es auch so probiert, in die Datei nur Datensätze zu schreiben, wenn Informationen zu der Datei vom Benutzer abgegeben wurden. Aber auch, wenn ich 20.000 gegen 2.000 abgleiche, dauert es viel zu lange.

Es läuft so, dass in einer TStringList alle neu eingelesenen stehen, in einer TList, bestehend aus PFileData sind die Daten, die aus der Liste gelesen wurden. Ich gehe dann die StringList durch, und vergleiche (nur um aufzuzeigen, wie das ungefähr läuft):

Delphi-Quellcode:
if StringList.Strings[x] = PFileData(List.Items[y].Dir) + PFileData(List.Items[y].File) then begin
  //Ist in Daten Liste
  StringList.Delete(x);
end;
Tja, und da liegt eben meine Frage - kann man das überhaupt so machen? Habt ihr Ideen, wie man das noch schneller hinbekommen könnte? Oder sollte ich lieber eine Datenbank benutzen, wie z.B. SQLite?

SirThornberry 15. Jan 2006 19:54

Re: 2 Listen durchwühlen
 
ich würde einfach die Prüfung in einen Thread packen der im Hintergrund läuft. So kann der Nutzer schon neues anlegen während im Hintergrund noch geprüft wird.

Der_Unwissende 15. Jan 2006 20:10

Re: 2 Listen durchwühlen
 
Hi,
benutz lieber eine THashedStringList und benutz die Sortiert. Dann ist der Zugriff auf einzelne Elemente schon etwas schneller. Mittels der Funktion IndexOf(s) kannst du ermitteln ob der String s sich in deiner StringList befindet und wenn ja an welche Position.
Dann wäre wohl noch das Property Objects[] zu erwähnen, du kannst jedem Eintrag deiner StringList noch ein beliebiges TObject anhängen. Wenn du also zu jeder Datei noch eine Klasse hast, die du anhängst, hast du so einen einfach Zugriff.

Für das Abgleichen würde ich auch sagen, bietet sich ein Thread an, der dass ganze mit niedrigerer Priorität im Hintergrund erledigt.

Gruß Der Unwissende

marabu 15. Jan 2006 21:21

Re: 2 Listen durchwühlen
 
Herzlich Willkommen in der Delphi-PRAXiS, wicht.

Eigentlich weiß ich viel zu wenig über dein Programm, aber wenn die Informationen schon im file system abgelegt werden, dann würde ich sie gleich bei der Datei speichern (property storage, DateiInfo) - so sind sie genau da wo sie gesucht werden.

Auf meiner Platte befinden sich 900.000 Dateien - die würde ich nie alle gleichzeitig in einer Benutzerschnittstelle zeigen wollen. Also würde ich nur das in den Speicher laden, was gerade nötig ist (virtual ListView).

Freundliche Grüße vom marabu

wicht 15. Jan 2006 23:33

Re: 2 Listen durchwühlen
 
Hi :)

Also, der Benutzer kann nach Dateien suchen oder mit einer Art Explorer navigieren.
Das wird auch schon mit einem TVirtualStringTree gemacht.
Die Daten in die Dateien direkt zu schreiben wäre schön, ist aber leider nicht möglich.. oder habe ich dich falsch verstanden?

marabu 16. Jan 2006 07:45

Re: 2 Listen durchwühlen
 
Hallo Alexander,

direkt in die Datei schreiben - ja und nein. Seit Windows 95 kannst du eine Datei auch als Objekt (compound file) ansehen - und Objekte haben Eigenschaften (properties). Schau dir einmal die Eigenschaften einer Datei in der Shell an und du wirst ein property sheet mit dem Titel Dateiinfo entdecken, welches dir die für diesen Dateityp registrierten Standardeigenschaften zugänglich macht. Für alle Dokumente im weitesten Sinne wird der property set DocumentSummary bereit gestellt, der u.a. die Eigenschaften Kommentar und Kategorie mitbringt - genau das was du brauchst.

Informationen hierzu findest du im Windows Platform SDK.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 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