![]() |
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 !! |
Moin Ernie,
was hast Du denn genau vor? |
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; |
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; |
Hey danke .. das hilft .. muss zwar n bisschen was ändern aber es hilft :D
|
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:
Ich habe den Code in dieser Form nicht getestet, er sollte aber funktionieren - mehr oder weniger :wink:
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; Parameterliste
Ich hoffe, dass das auch ein wenig hilft. P.S. Luckie: Nicht böse sein :D |
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; |
Hallo Christian,
interessante Lösung. Ist diese Lösung auch rekursiv? Soll heißen: liefert LB_DIR auch die Dateien der Unterverzeichnisse? |
Hi,
funktioniert das ganze auch mit Dateien ohne Name? z.B.: .htaccess Grüsse, Daniel :) |
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 10:47 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-2025 by Thomas Breitkreuz