AGB  ·  Datenschutz  ·  Impressum  







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

Dateiliste gefiltert erstellen

Ein Thema von DieDolly · begonnen am 24. Aug 2023 · letzter Beitrag vom 25. Aug 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#1

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 16:38
* Ein Delphi-Referenz durchsuchenMatchText, direkt auf's Array, geht ja nicht, für TeilStrings.
* Am Einfachsten mit Delphi-Referenz durchsuchenEndsText, aber ich würde noch ein '\' davor hängen, weil
Delphi-Quellcode:
EndsText('FileX.exe', 'C:\dir\FileX.exe') = True
EndsText('FileX.exe', 'C:\dir\absadsadFileX.exe') = True
EndsText('\' + 'FileX.exe', 'C:\dir\absadsadFileX.exe') = False
wobei hier natürlich wäre direkt if ExtractFilenName('C:\dir\FileX.exe') = 'FileX.exe' besser
bzw. if MatchText(ExtractFilenName('C:\dir\FileX.exe'), ['FileX.exe', Xyz.exe])
aber
Delphi-Quellcode:
EndsText('dir\FileX.exe', 'C:\dir\FileX.exe') = True
EndsText('dir\FileX.exe', 'C:\absadsaddir\FileX.exe') = True
EndsText('\' + 'dir\FileX.exe', 'C:\absadsaddir\FileX.exe') = False
Delphi-Quellcode:
FileNamenArray := TDirectory.GetFiles('C:\dir', '*.*', TSearchOption.soAllDirectories,
  procedure (const Path: string; const SearchRec: TSearchRec): Boolean
  begin
    // SearchRec.Name = nur der Dateiname
    // TPath.Combine(Path, SearchRec.Name) = vollsändiger Pfad
    Result := True wenn Pfad im ergebnis sein soll.
    // es geht auch Result := False; und selbst irgendwo in einer externen Liste speichern oder direkt verarbeiten
  end);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Aug 2023 um 16:42 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 16:45
Zitat:
EndsText('FileX.exe', 'C:\dir\absadsadFileX.exe') = True
EndsText kann ich nicht nehmen, weil ein FileX.exe in der Filterliste gilt nur im Hauptverzeichnis, nirgendwoanders.

Der Teilstring ist kein Problem. Ich kann das Hauptverzeichnis einfach vorne dranhängen!
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 17:48
Ich stelle mir gerade die Frage, ob es nicht eigentlich schneller wäre die Dateiliste einfach zu erzeugen ohne irgendwas rauszufiltern.
Kann man dann beide Listen miteinander vergleichen und Einträge aus Dateiliste löschen die in Filterliste vorhanden sind, ohne jeden Eintrag von beiden Listen miteinander zu vergleichen?

Beispiel:
Dateiliste (existierende Dateien):
C:\File1.exe
C:\File2.exe
C:\File3.exe
C:\Sub1\Sub2\File1.exe
C:\FileX.exe
C:\Sub1\FileY.exe
C:\File4.exe
C:\File5.exe

Filterliste (auf Dateiliste anwenden):
C:\Sub1\Sub2\File1.exe
C:\FileX.exe
C:\Sub1\FileY.exe

Am Ende dürfte also nur übrig bleiben:
C:\File1.exe
C:\File2.exe
C:\File3.exe
C:\File4.exe
C:\File5.exe

Geändert von DieDolly (24. Aug 2023 um 17:58 Uhr)
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
351 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 17:49
Hallo,

bau dir eine einfache HashListe mit HashItems (mit Key=Dateiname und Path-Eigenschaft im HashItem). Der Vergleich letztendlich geht dann super schnell.

Beste Grüße
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 17:53
Ich kann das System nicht mehr umstellen. Eine neue Liste kann ich erstellen weil ich dann wochenlang beschäftigt wäre alles abzuändern.

Die Listen sind nicht das Problem, das Erstellen ist superschnell. Das vergleichen dauert ewig, deswegen meine Idee oben. Bitte durchlesen.
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
351 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 18:00
Ok, wie findest du File1.exe von Liste1 in Liste2 ?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 18:09
Anders erklärt.

Die Dateiliste A wird von Winapi.Windows.FindFirstFileEx() erstellt. Das sind alle Dateien in einem Verzeichnis.
Filterliste B sind ein paar Einträge von Dateien, die am Ende nicht in A landen sollen.

Das funktioniert ja alles schon, aber ist langsam. Weil jeder Fund von Winapi.Windows.FindFirstFileEx() iteriert die komplette Liste B durch.

Meine Idee wäre jetzt, die Dateiliste A erstmal ohne Filterung komplett zu erstellen und erst danach A und B zu vergleichen.

Alles aus B soll dann aus A verschwinden.

Fast vergessen. Da die Liste A Objekte enthält, muss ich da nicht zwangsläufig Einträge rauslöschen. Man könnte auch einfach eine Flag setzen, sodass die im späteren Verlauf ignoriert werden. Das würde der vorhandene Code zulassen.

Zusammengefasst:
beide Listen existieren, das Zusammenstellen der Listen ist rasendschnell und schnell genug.
Es hapert nur beim Vegleich.

Weil Wenn Liste A 15.000 Einträge hat und B 1000, sind das, wenn man jeden Eintrag mit jedem vergleicht, sehr viele Vergleiche, viele davon mehr als unnötig.

Geändert von DieDolly (24. Aug 2023 um 18:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#8

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 18:37
HashListe oder einfach nur eine sortierte Liste ... da lässt sich schneller finden,
selbst wenn man eine TStringList benutzt.

TStringList.Sorted=True und TStringList.IndexOf
TDictionary<>
TArray<string> mit TArray.BinarySearch<string> (zum Suchen, aber auch zum "sortierten" Einfügen), bzw. TArray.Sort<string>
...



EndsText kann ich nicht nehmen, weil ein FileX.exe in der Filterliste gilt nur im Hauptverzeichnis, nirgendwoanders.
Dann mußt du wohl deine Pfade zu RelativenPfaden machen.
und dann kannst'e mit MatchText oder TArray.BinarySearch oder

Delphi-Referenz durchsuchenExtractRelativePath
Delphi-Referenz durchsuchenTPath.IsPathRooted
siehe https://docwiki.embarcadero.com/RADS...ation_Routines
oder

oder ReplaceStr ähhh ReplaceText(FullFileName, 'C:\root\', '') [b][\b]
oder Delete(FullFileName, 1, Length('C:\root\')); (natrürlich aufpassen, falls nicht in diesem Pfad)
oder ...


https://stackoverflow.com/questions/...aths-in-delphi
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Aug 2023 um 18:40 Uhr)
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
351 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dateiliste gefiltert erstellen

  Alt 24. Aug 2023, 18:48
Zitat:
Weil Wenn Liste A 15.000 Einträge hat und B 1000, sind das, wenn man jeden Eintrag mit jedem vergleicht, sehr viele Vergleiche, viele davon mehr als unnötig.
Aber diese unnötigen Vergleiche verhinders du ja mit der HashListe.

vorhanden:

ListeB

File20
..
File30

von ListeB HashListe erstellen (oder gleich als Hash halten)


---

wird geade erstellt:

ListeA

File1 -> HashIndex berechnen und in ListeB im Index gucken => nicht da, kann in ListeA bleiben
..
File20 - HashIndex berechnen und in ListeB im Index gucken -> vorhanden, kann aus ListA raus
..
File100

ggf. Dateiname und Pfad wie oben erwähnt trennen und bei Vergleich nutzen.

Deine Suche dauert zu lange.
  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 02:27 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 by Thomas Breitkreuz