Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dateinamen in einem Ordner abfragen?? (https://www.delphipraxis.net/111-dateinamen-einem-ordner-abfragen.html)

erniepb 11. Jun 2002 23:02


dateinamen in einem Ordner abfragen??
 
Hallöchen...
Hab folgendes Problem .. wie frage ich die Dateien in einem beliebigen Ordner ab ?? Momentan benutz ich die FileListBoxKomponente .. aber so ganz das wahre ist das ja wohl nich .. gibts da vielleicht noch n elegantere Möglichkeit ?? weil die FileListbox existiert nur aus diesem einen Grund ..

Danke !!

Christian Seehase 11. Jun 2002 23:06

Moin Ernie,

was hast Du denn genau vor?

erniepb 11. Jun 2002 23:14

also ich suche eigentlich nach selbst erstellten Dateien des Typs '.fct' mit einer 8stelligen Zahl davor ( z.B. '10000000.fct') .. das sind Dateien die temporäre Wertetabellen enthalten um den Arbeitsspeicher zu entlasten .. aber das nur nebenbei .. Ziel ist es einen neuen noch verfügbaren numerischen Dateinamen zu finden ..

meine Momentane Funktion die Ordner und Dateinamen zurückgibt, sieht so aus:

Code:
function TFormFileManagement.GetAvailableTemporaryValueChartAddress(Directory: String): String;
 const
  SubDirectory = '\save';
 var
  i1 : LongInt;
  FileNumber : LongInt;
  FileName : String;
 begin
  FileListBox.ApplyFilePath(Directory + SubDirectory);
  FileListBox.Update;
  i1 := 0;
  FileNumber := 10000000;

  If FileListBox.Items.Count > 0 Then
   repeat
    If (IntToStr(FileNumber) + '.fct') = FileListBox.Items[i1] Then
     Begin
      i1 := -1;
      FileNumber := FileNumber + 1;
     End;
    i1 := i1 + 1;
   until i1 = FileListBox.Items.Count;
  FileName := IntToStr(FileNumber) + '.fct';

  If SubDirectory <> '' Then
   GetAvailableTemporaryValueChartAddress := Directory + SubDirectory + '\' + Filename
  Else GetAvailableTemporaryValueChartAddress := Directory + SubDirectory + Filename;
 end;

Luckie 11. Jun 2002 23:19

Um eine Datei zu finden kannst du folgenden Code verwenden. Mit dem gleichen Prinzip, nur etwas anpassen halt.

Code:
function suchdatei(pfad,datei:string):string;
var
  sr:TSearchRec;
begin
  result:='';
  if findfirst(pfad+'*.*',$27,sr)=0 then
    repeat
      if ansilowercase(sr.name)=ansilowercase(datei) then
      begin
        result:=pfad+datei;
        break;
      end;
    until findnext(sr)<>0;
  FindClose(Sr);
end;

function finden(start,datei:string):string;
var
  sr:TSearchRec;
  hlp:string;
begin
  if ansilastchar(start)<>'\' then
    start:=start+'\';
  result:=suchdatei(start,datei);
  if result <> '' then exit;
  if findfirst(start+'*.*',faAnyfile,sr)=0 then
  begin
    repeat
      if (sr.Attr and faDirectory > 0)and(sr.name[1]<>'.') then
      begin
        hlp:=start+sr.name;
        result:=finden(hlp,datei);
        if result <> '' then break;
      end;
    until findnext(sr)<>0;
  FindClose(Sr);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Ergebnis,Startverzeichnis,Dateiname:string;
begin
  Startverzeichnis:='C:';
  Dateiname:='Error.wav';
  screen.cursor:=crhourglass;
  Ergebnis:=finden(Startverzeichnis,Dateiname);
  if Ergebnis <> '' then
    showmessage(Ergebnis)
  else
    showmessage('Nicht gefunden');
  screen.cursor:=crdefault;
end;

erniepb 11. Jun 2002 23:31

Hey danke .. das hilft .. muss zwar n bisschen was ändern aber es hilft :D

sakura 12. Jun 2002 08:49

Hi,

ich habe noch eine kleine Anmerkung zu Luckies Code :!:

Luckie testet, ob der Datei-/Verzeichnisname mit einem Punkt anfängt, übersieht jedoch den Fakt, das dieses sogar legitim ist, auch wenn der Explorer selbst das nicht zulässt. Von daher möchte ich noch folgenden Code vorschlagen. (Zusätzlich sind Datei- und Verzeichnissuche miteinander verbunden, die Liste ist unsortiert.)

Desweiteren habe ich noch einen try...finally...end Block eingesetzt, welcher garantiert, dass FindClose aufgerufen wird, um die von FindFirst belegten Ressourcen wieder freizugeben.

Code:
procedure FindFiles(Directory: String; Recurse: Boolean; List: TStrings);
var
  Res: Integer;
  SR: TSearchRec;
begin
  if AnsiLastChar(Directory)^ <> '\' then
    Directory := Directory + '\';
  Res := FindFirst(Directory + '*.*', faAnyFile, SR); try
  if Res = 0 then
  repeat
    if (SR.Name <> '.') and (SR.Name <> '..') then
      if SR.Attr and faDirectory = 0 then
        List.Add(Directory + SR.Name)
      else if Recurse then
        FindFiles(Directory + SR.Name, True, List);
  until FindNext(SR) <> 0;
  finally FindClose(SR);
end;
Ich habe den Code in dieser Form nicht getestet, er sollte aber funktionieren - mehr oder weniger :wink:

Parameterliste
  • Directory - Startverzeichnis für die Dateisuche
  • Recurse - True um Unterverzeichnisse nach Dateien zu durchsuchen
  • List - Ein String List (z.B. TStringList), welche die gefundenen Dateien aufnimmt.

Ich hoffe, dass das auch ein wenig hilft.

P.S. Luckie: Nicht böse sein :D

Christian Seehase 12. Jun 2002 11:18

Moin Zusammen,

dann will ich noch mal meine Methode alle Dateien eines Verzeichnisses auszulesen beisteuern. Um einen Parameter zu sparen als Methode des Formulares.

Code:
procedure TForm1.GetFiles(const p_sRootDir : string;const p_slResult : TStrings);

var
  lb : TListBox;

begin
  lb := TListBox.CreateParented(self.Handle);
  try
    SendMessage(lb.Handle,LB_DIR,DDL_ARCHIVE or DDL_HIDDEN or DDL_READONLY or DDL_READWRITE or DDL_SYSTEM,lParam(PChar(p_sRootDir+'\*.*')));
    p_slResult.AddStrings(lb.Items);
  finally
    FreeAndNil(lb);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetFiles('c:\winnt\system32',Memo1.Lines);
end;

MrSpock 12. Jun 2002 11:33

Hallo Christian,

interessante Lösung. Ist diese Lösung auch rekursiv? Soll heißen: liefert LB_DIR auch die Dateien der Unterverzeichnisse?

Daniel B 12. Jun 2002 11:44

Hi,

funktioniert das ganze auch mit Dateien ohne Name?
z.B.: .htaccess

Grüsse, Daniel :)

Christian Seehase 12. Jun 2002 11:51

Moin Mr. Spock,

die Lösung ist meines Wissens nicht rekursiv, sondern eher als Basis für ein iteratives Durchsuchen geeignet.
Ausserdem dürfte LB_DIR auch die Basis für die FileListBox sein.
Werden andere Flags gesetzt, lassen sich auch direkt enthaltene Unterverzeichnisse bzw. Laufwerke anzeigen.


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