Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wildcards String (https://www.delphipraxis.net/204958-wildcards-string.html)

lukdelphias 17. Jul 2020 11:57

Wildcards String
 
Hallo liebes Forum,

ich habe ein Problem. Mein Programm soll einen Ordner samt Inhalt vom PC löschen. Funktioniert soweit auch sehr gut. Der Ordner wird relativ regelmäßig neu erzeugt. Allerings immer mit einem anderen Präfix. z.B. C:\Users\user.'+CompName+'\Desktop\123456_Ordner und später C:\Users\user.'+CompName+'\Desktop\789012_Ordner.
Habe mir dann eine Funktion Remove erstellt:

Delphi-Quellcode:
Remove('C:\Users\user.'+CompName+'\Desktop\Ordner');
Wie bekomme ih hier nun Wildcards hinein das ich beim löschen nur schauen muss ob das Wort Ordner im Namen vorkommt?

Ich stelle mir das so vor:

Delphi-Quellcode:
Remove('C:\Users\user.'+CompName+'\Desktop\??????Ordner');
Die Fragezeichen sollen hier also die Wildcards darstellen.
Ich hoffe einigermaßen verständlich.

Vielleicht hat jemand ne Idee.

grüße

TiGü 17. Jul 2020 12:25

AW: Wildcards String
 
Delphi-Quellcode:
procedure RemoveFolder(const AFolderNameWithWildcard: string);
var
  SearchRecord: TSearchRec;
  BaseFilePath: string;
  FoundName: string;
const
  FILE_ATTRIBUTES = faDirectory;
begin
  if FindFirst(AFolderNameWithWildcard, FILE_ATTRIBUTES, SearchRecord) = 0 then
  begin
    BaseFilePath := ExtractFilePath(AFolderNameWithWildcard);
    repeat
      FoundName := BaseFilePath + SearchRecord.Name;

      if TDirectory.Exists(FoundName) then
        TDirectory.Delete(FoundName);
    until FindNext(SearchRecord) <> 0;

    FindClose(SearchRecord);
  end;
end;
So aufzurufen:
Delphi-Quellcode:
RemoveFolder('C:\Users\user.'+CompName+'\Desktop\*Ordner');

Wildcard ist zumeist ein Sternchen!

Andreas13 17. Jul 2020 12:40

AW: Wildcards String
 
Hallo,
es ist ratsam, anstelle von FindClose(SearchRecord); einen qualifizierten Bezeichner
Delphi-Quellcode:
System.SysUtils.FindClose(SearchRecord);
zu verwenden, weil es u. U. Konflikt geben kann mit der gleichnamigen Procedure WinAPI.Windows.FindClose(SearchRecord); , die allerdings einen anderen Datentyp erwartet.
Gruß, Andreas

lukdelphias 17. Jul 2020 12:53

AW: Wildcards String
 
Zitat:

Zitat von TiGü (Beitrag 1469791)

Wildcard ist zumeist ein Sternchen!

Müssen hier soviele Sterne angegeben werden wie es Zeichen sein sollen oder reicht einer?

Grüß

lukdelphias 17. Jul 2020 12:54

AW: Wildcards String
 
Unter in deinem Quellcode ist TDirectrory ein undeklarierter Bezeicher... Sollte das eher faDirectory sein??

lukdelphias 17. Jul 2020 12:59

AW: Wildcards String
 
noch eine Frage. Irgendwie funktioniert der Code bei mir überhaupt nicht TiGü. Ist der Code von dir getestet worden?

TiGü 17. Jul 2020 13:05

AW: Wildcards String
 
Herrje, man muss wieder im Urschleim anfangen. :shock:

Ja, nur ein Sternchen für beliebige Kombinationen.

Also ein
Delphi-Quellcode:
'C:\temp\*_Ordner'
findet und löscht:
Code:
C:\temp\12313123_Ordner
C:\temp\1_Ordner
C:\temp\4545_Ordner
C:\temp\BlaKeksFuck_Ordner
Das muss in der uses-Klausel stehen, dann erkennt er auch TDirectory (Hier hätte ein beherzter Griff zur Hilfe oder in dieses Internet auch geholfen):
Delphi-Quellcode:
uses
  System.SysUtils,
  System.IOUtils;

lukdelphias 17. Jul 2020 13:13

AW: Wildcards String
 
Ahh sehr schön Danke. Ja tut mir leid bin noch nicht so weit mit Delphi. Erst mein zweites kleines Projekt. :/
Das Problem bei deiner Variante ist, dass nur leere Verzeichnisse gelöscht werden können. Hast du da noch eine Idee wie man das umgehen kann, sodass auch "besetzte" Verzeichnisse gelöscht werden können.

Gruß

Aviator 17. Jul 2020 13:37

AW: Wildcards String
 
Zitat:

Zitat von lukdelphias (Beitrag 1469802)
Hast du da noch eine Idee wie man das umgehen kann, sodass auch "besetzte" Verzeichnisse gelöscht werden können.

Gib mal beim
Delphi-Quellcode:
TDirectory.Delete()
Aufruf als zweiten Parameter noch
Delphi-Quellcode:
True
mit. Das bedeutet "Rekursiv". Siehe auch die Hilfe zu TDirectory.Delete().

Uwe Raabe 17. Jul 2020 13:39

AW: Wildcards String
 
Wenn schon TDirectory, warum dann noch der Umweg über FindFirst?

Delphi-Quellcode:
var
  FoundName: string;
begin
  for FoundName in TDirectory.GetDirectories('C:\Users\user.'+CompName+'\Desktop', '*_Ordner') do
    TDirectory.Delete(FoundName, True);
end;

lukdelphias 17. Jul 2020 13:40

AW: Wildcards String
 
Perfekt danke das funktioniert.

Vielen Dank euch allen für die schnelle Hilfe.

geldis 4. Aug 2024 09:01

AW: Wildcards String
 
Etwas älter der Threat aber:

In dem definierten Verzeichnis »ModPath« befinden sich unterschiedlich viele der mit [StartShips]..... gesetzten Verzeichnisse. Beispiel:

Code:
[StartShips] Flaggschiff
[StartShips] Kreuzer
[StartShips] Tankschiff
[StartShips] U-Boot
[StartShips] Values
Der nachstehende Befehl zum entfernen dieser Verzeichnisse aus dem »ModPath« funktioniert einwandfrei:

Delphi-Quellcode:
TDirectory.GetDirectories(ModPath+'\', '*[StartShips]') do TDirectory.Delete(FoundName, True);
Aber er lässt immer ein Verzeichnis über. In diesem Beispiel [StartShips] Flaggschiff, letztlich immer das erste Verzechniss, das alphabetisch oben steht.

Was ist das?

geldis

himitsu 4. Aug 2024 11:18

AW: Wildcards String
 
Trenn es doch erstmal auf?

* findet GetDirectories alles?
* und löscht Delete das dann auch wirklich?

Ich hätte eher gedacht, dass garnichts gelöscht wird, weil ähhhhh :stupid:
Delphi-Quellcode:
'*[StartShips]'

Delphi-Quellcode:
'[StartShips]*'



PS: ich bin mir sicher, dass
Delphi-Quellcode:
+'\'
nicht nötig sein sollte.

geldis 4. Aug 2024 11:39

AW: Wildcards String
 
Tja, der oben angezeigte Code ist nicht ganz komplett:

Delphi-Quellcode:
     for FoundName in TDirectory.GetDirectories(ModPath+'\', '*[StartShips]') do TDirectory.Delete(FoundName, True);
Er zeigt mir hiermit alle enthaltenen Verzeichnisse an. Bis auf das Erste.

Und er löscht alle entsprechenden Verzeichnisse. Bis auf das Erste.

Wildcard:
*[StartShips] wie gesagt.
*[StartShips]* löscht alles !!
[StartShips]* löscht nichts ??

geldis

himitsu 4. Aug 2024 16:19

AW: Wildcards String
 
LÖL :lol:

IOUtils nimmt teilweise (nicht immer) des MatchesMask aus System.Masks (sucht nach allem und filtert selbst),
und an anderen Stellen verwendet es den Filter direkt via FindFirstFile.

MatchesMask nutzt aber nicht nur * und ?, sondern auch CharSets via [] :freak:


So
Delphi-Quellcode:
'[[]StartShips[]]*'
?

geldis 4. Aug 2024 16:31

AW: Wildcards String
 
Das folgende funktioniert genau wie gewünscht :

Delphi-Quellcode:
   for FoundName in TDirectory.GetDirectories(ModPath+'\', '*StartShips*') do TDirectory.Delete(FoundName, True);
Man muss die eckigen Klammern weglassen - obwohl im Verzeichnisnamen enthalten. Gemerkt habe ich das als ich den eigentlich für mein Verständnis erforderlichen BackSlash entfernt und direkt in den Suchstring gesetzt habe.
In der erscheinenden Fehlermeldung wird der Slash als «Ungültige Zeichen im Suchmuster : [\[StartShips]*]» angegeben (EInOUtArgumentException). Und da fielen mir die eckigen Klammern um den Fehleranzeigestring auf. Hmmmm... Also mal den Suchstring wie oben definiert anz ohne eckige Klammern - klappt.

Aber so richtig verstehen kann ich das jetzt nicht. Denn für einen Ordnernamen sind die eckigen Klammern ja zugelassen ......

Jedenfalls geht es jetzt.

geldis

P.S.
'[[]StartShips[]]*' habe ich jetzt nicht probiert. Aber das riecht auch als Möglichkeit.... Danke jedenfalls, ich werde das mal probieren. Rein Interessehalber.


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