Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Platzhalter in FindFirst/FindNext (https://www.delphipraxis.net/191019-platzhalter-findfirst-findnext.html)

p80286 30. Nov 2016 11:42

Platzhalter in FindFirst/FindNext
 
Hallo zusammen,
ich suche (auf einem Serverlaufwerk) Dateien deren erster Buchstabe im Namen H ist also

Delphi-Quellcode:
mask:='H*';
sstring:=mypath;

  sstring:=sstring+mask;
  weiter:=sysutils.FindFirst(sstring, faAnyFile, SearchRec);
  if weiter=0 then begin
    if (searchrec.attr and fadirectory = 0) then
      dl.add(sfill+searchrec.name);
    while weiter=0 do begin
      weiter:=sysutils.FindNext(SearchRec);
      if (weiter=0) and (searchrec.attr and fadirectory = 0) then begin
        dl.add(sfill+searchrec.name);
      end;
    end;{while------------------}
  end;
  sysutils.FindClose(SearchRec);
Das funktioniert nur bedingt, da auch Dateinamen zurück gegeben werden mit '....H...' und nicht nur 'H.......'.
Gut das kann ich filtern mit
Delphi-Quellcode:
if Dateiname[1]='H' then ..
aber wofür dann die Maske?
(das Programm läuft unter W7)

Mit 'H*.*' ist es das gleiche Ergebnis.



Gruß
K-H

EmWieMichael 30. Nov 2016 12:26

AW: Platzhalter in FindFirst/FindNext
 
Besteht das Problem nur auf dem Serverlaufwerk oder auch lokal. Ist das Serverlaufwerk gemappt?

Bei mir funktioniert diese Routine unter Win 7 lokal einwandfrei (ich habe mir erlaubt, das Ganze etwas zu verkürzen):
Delphi-Quellcode:
  S:='D:\TEMP\H*.*';
  if (FindFirst(S, faAnyFile, SearchRec) = 0) then
   begin
     repeat
       if (searchrec.attr and fadirectory = 0) then
        //dl.add(sfill+searchrec.name);
        SayStr(searchrec.name);
     until (FindNext(SearchRec) <> 0);
     FindClose(SearchRec);
   end;
(SayStr ist eine MessageBox)

Blup 30. Nov 2016 12:29

AW: Platzhalter in FindFirst/FindNext
 
Zur eigentlichen Frage kann ich auch nichts aussagen.

FindClose muss nur aufgerufen werden (und nur dann!) wenn FindFirst erfolgreich war.
Andernfalls ist SearchRec nicht initialisiert und FindClose könnte Fehlern verursachen.

himitsu 30. Nov 2016 13:32

AW: Platzhalter in FindFirst/FindNext
 
Alternativ alles '*.*' suchen
und dann selber filtern.

TMask, MatchesMask (Masks.pas)
MaskUtils.pas

Falls das MatchesMask in D7 wo anders ist und nicht gefunden wird, dann eventuell mal bei TMaskEdit (Mask.pas) nachgucken.



oder Regex
oder MatchStr/MatchText/Pos
oder ...

p80286 30. Nov 2016 17:46

AW: Platzhalter in FindFirst/FindNext
 
@Himi das wir diese Verschlimmbesserungen in W ausbaden dürfen find ich gut!

@BLUB guter Hinweis! wird ich schnellstens verwursten!

@M Der lokale Test fehlt mir, da ich im Augenblick nicht dazu komme, da was vernünftiges aufzubauen, wäre aber zu berücksichtigen.
(der Beispielkode ist der Ausschnitt aus einem größeren Stück und Deine Verkürzung ist leider kontraproduktiv)

Vielen Dank an alle, mal schauen was sich daraus machen läßt.

@Himi der Übeltäter war D2006! noch etwas was ich prüfen müßte!

Gruß
K-H

nahpets 30. Nov 2016 18:48

AW: Platzhalter in FindFirst/FindNext
 
Für den Fall, dass das Dateisystem NTFS sein sollte, so reicht faAnyFile nicht aus. Vom Filesystem komprimierte Dateien werden damit nicht gefunden.

Bei mir sieht das in 'ner entsprechenden Klasse so aus (Ausschnitt):
Delphi-Quellcode:
Var
  sr                 : TSearchRec;
  FileAttrs          : Integer;
Begin
  FileAttrs :=            SysUtils.faReadOnly;
  FileAttrs := FileAttrs + SysUtils.faHidden;
  FileAttrs := FileAttrs + SysUtils.faSysFile;
  FileAttrs := FileAttrs + SysUtils.faDirectory;
  FileAttrs := FileAttrs + SysUtils.faArchive;
  FileAttrs := FileAttrs + SysUtils.faSymLink;
  FileAttrs := FileAttrs + 2048; // komprimierte Dateien unter NTFS

  // faReadOnly = $00000001 platform;
  // faHidden   = $00000002 platform;
  // faSysFile  = $00000004 platform;
  // faVolumeID = $00000008 platform;
  // faDirectory = $00000010;
  // faArchive  = $00000020 platform;
  // Summe bis hierher entspricht:
  // faAnyFile  = $0000003F;
  // 
  // faSymLink  = $00000040 platform;
(Zugegeben unter Delphi 7, weiß nicht, ob neuere Delphis die komprimierten Dateien unter NTFS inzwischen bei Nutzung von faAnyFile berücksichtigen.)

himitsu 30. Nov 2016 21:07

AW: Platzhalter in FindFirst/FindNext
 
PS: BitMasken addiert man nicht.

OR

EmWieMichael 1. Dez 2016 07:29

AW: Platzhalter in FindFirst/FindNext
 
Zitat:

Zitat von p80286 (Beitrag 1355058)
...
und Deine Verkürzung ist leider kontraproduktiv
...

Das klingt spannend. Warum ist denn eine Routine mit weniger Code, die exakt das gleiche Ergebnis liefert, wie eine Routine mit mehr Code kontraproduktiv?

stalkingwolf 1. Dez 2016 10:23

AW: Platzhalter in FindFirst/FindNext
 
btw. Vorsicht mit FindFirst/FindNext.
Es kann sein das nur 512 Dateien zurückgegeben werden und danach FindNext keinen Treffer mehr findet.
Da bin ich mal bei verrückt geworden.

Alter Mann 1. Dez 2016 11:11

AW: Platzhalter in FindFirst/FindNext
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin, Moin,

versuch mal den Code aus dem Anhang, er sollte das machen was du suchst/brauchst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 1 von 2  1 2      

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