![]() |
Verzeichnis auslesen ohne SysUtils
Hallo,
ich programmiere mit Delphi 7 Enterprise. ich brauche eine funktion, die mir ein verzeichnis ausliest. Da ich nonVCL programmiere und die SysUtils gern vermeiden möchte, suche ich nach einer alternative. ich hab versucht die benötigten funktionen direkt aus der SysUtils zu übernehmen,allerdings spinnt seitdem mein debugger. zeigt nur noch unsinn naja. da ich zu diesem thema bisher nichts gefunden habe, ist hier mein beitrag. gibt es noch andere wege, ein verzeichnis unter windows auszulesen ? |
Re: Verzeichnis auslesen ohne SysUtils
hab grad was gefunden
Delphi-Quellcode:
allerdings brauch ich dafür ne listbox :/
procedure TForm1.GetDirectoryContent(const p_sRoot : string;const p_slResult : TStrings);
var lbWork : TListBox; begin // Filectrl einbinden für DirectoryExists if not DirectoryExists(p_sRoot) then begin exit; end; lbWork := TListBox.CreateParented(self.Handle); try SendMessage(lbWork.Handle,LB_DIR,DDL_DIRECTORY,lParam(PChar(p_sRoot+StringOfChar('\',ord(AnsiLastChar(p_sRoot) <> '\'))+'*.*'))); lbWork.Items.Delete(lbWork.Items.IndexOf('[..]')); p_slResult.Clear; p_slResult.AddStrings(lbWork.Items); finally FreeAndNil(lbWork); end; end; kann ich der message auch nen WindowHandle zuweisen und das dann abfangen ? |
Re: Verzeichnis auslesen ohne SysUtils
Hallo,
geh mal zu Msdn und fange bei CreateFile an zu suchen (das wird auch zum Öffnen von Dateien und Verzeichnissen benutzt). Heiko |
Re: Verzeichnis auslesen ohne SysUtils
Zitat:
Bernhard |
Re: Verzeichnis auslesen ohne SysUtils
|
Re: Verzeichnis auslesen ohne SysUtils
@rollstuhlfahrer
genau das hab ich gemacht, allerdings gibt'S da einige platformabhängige konstanten und so weiter, da meckert er nacher rum |
Re: Verzeichnis auslesen ohne SysUtils
Zitat:
Edit: hab mich verlesen, hab erst nur FindFirst gelesen ^^ FindFirstFile ist eine gute Alternative zu FindFirst und basiert auf der Windows Unit |
Re: Verzeichnis auslesen ohne SysUtils
Zitat:
|
Re: Verzeichnis auslesen ohne SysUtils
übrigens läuft nonVCL eh nicht auf anderen Host-Systemen als Windows, da ja direkt auf die Win-API zurückgegriffen wird. Ich hab dann bei solchen Sachen entweder die Warnungen deaktiviert oder den platform-Operator entfernt.
Bernhard |
Re: Verzeichnis auslesen ohne SysUtils
ok, so sieht meine unit aus
Delphi-Quellcode:
das komische ist, er zeigt da nen fehler an unzwar: Missing parameter type;
unit dir;
interface uses windows; type LongRec = packed record case Integer of 0: (Lo, Hi: Word); 1: (Words: array [0..1] of Word); 2: (Bytes: array [0..3] of Byte); end; type TFileName = string; type TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end; const faReadOnly = $00000001 platform; faHidden = $00000002 platform; // hier fehler faSysFile = $00000004 platform; faVolumeID = $00000008 platform; faDirectory = $00000010; faArchive = $00000020 platform; faSymLink = $00000040 platform; faAnyFile = $0000003F; function FindFirst(const Path: string; Attr: Integer; forward; function FindNext(var F: TSearchRec): Integer; forward; procedure FindClose(var F: TSearchRec); forward; function FindMatchingFile(var F: TSearchRec): Integer; forward; implementation function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; const faSpecial = faHidden or faSysFile or faVolumeID or faDirectory; begin F.ExcludeAttr := not Attr and faSpecial; F.FindHandle := FindFirstFile(PChar(Path), F.FindData); if F.FindHandle <> INVALID_HANDLE_VALUE then begin Result := FindMatchingFile(F); if Result <> 0 then FindClose(F); end else Result := GetLastError; end; function FindNext(var F: TSearchRec): Integer; begin if FindNextFile(F.FindHandle, F.FindData) then Result := FindMatchingFile(F) else Result := GetLastError; end; procedure FindClose(var F: TSearchRec); begin {$IFDEF MSWINDOWS} if F.FindHandle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(F.FindHandle); F.FindHandle := INVALID_HANDLE_VALUE; end; {$ENDIF} {$IFDEF LINUX} if F.FindHandle <> nil then begin closedir(F.FindHandle); F.FindHandle := nil; end; {$ENDIF} end; function FindMatchingFile(var F: TSearchRec): Integer; var LocalFileTime: TFileTime; begin with F do begin while FindData.dwFileAttributes and ExcludeAttr <> 0 do if not FindNextFile(FindHandle, FindData) then begin Result := GetLastError; Exit; end; FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo); Size := FindData.nFileSizeLow; Attr := FindData.dwFileAttributes; Name := FindData.cFileName; end; Result := 0; end; end. und für die nächste zeile folgenden fehler: Identifier expected but "FUNCTION" found. das ergibt überhaupt keinen sinn :gruebel: Edit: setze ich die Konstanten direkt unter uses, tritt der fehler beim TsearchRec auf |
Re: Verzeichnis auslesen ohne SysUtils
Punkt 1: mach mal die ganzen Platform weg und schreib dir dafür nen Kommentar irgendwo hin, dass diese Unit NUR unter Windows funktioniert. Dann nimmst du die ganzen {$IFDEF LINUX}-Blöcke und schmeißt diese auch raus. Du arbeitest ja mit Windows.
So, nach dieser Entschlankungskur sollte es einfacher sein, den Fehler zu finden. |
Re: Verzeichnis auslesen ohne SysUtils
Zitat:
|
Re: Verzeichnis auslesen ohne SysUtils
Folgendes läuft bei mir ohne Fehler:
Delphi-Quellcode:
Bernhard
unit dir;
interface uses windows; type LongRec = packed record case Integer of 0: (Lo, Hi: Word); 1: (Words: array [0..1] of Word); 2: (Bytes: array [0..3] of Byte); end; type TFileName = string; type TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end; const faReadOnly = $00000001; faHidden = $00000002; faSysFile = $00000004; faVolumeID = $00000008; faDirectory = $00000010; faArchive = $00000020; faSymLink = $00000040; faAnyFile = $0000003F; function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; forward; function FindNext(var F: TSearchRec): Integer; forward; procedure FindClose(var F: TSearchRec); forward; function FindMatchingFile(var F: TSearchRec): Integer; forward; implementation function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; const faSpecial = faHidden or faSysFile or faVolumeID or faDirectory; begin F.ExcludeAttr := not Attr and faSpecial; F.FindHandle := FindFirstFile(PChar(Path), F.FindData); if F.FindHandle <> INVALID_HANDLE_VALUE then begin Result := FindMatchingFile(F); if Result <> 0 then FindClose(F); end else Result := GetLastError; end; function FindNext(var F: TSearchRec): Integer; begin if FindNextFile(F.FindHandle, F.FindData) then Result := FindMatchingFile(F) else Result := GetLastError; end; procedure FindClose(var F: TSearchRec); begin {$IFDEF MSWINDOWS} if F.FindHandle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(F.FindHandle); F.FindHandle := INVALID_HANDLE_VALUE; end; {$ENDIF} {$IFDEF LINUX} if F.FindHandle <> nil then begin closedir(F.FindHandle); F.FindHandle := nil; end; {$ENDIF} end; function FindMatchingFile(var F: TSearchRec): Integer; var LocalFileTime: TFileTime; begin with F do begin while FindData.dwFileAttributes and ExcludeAttr <> 0 do if not FindNextFile(FindHandle, FindData) then begin Result := GetLastError; Exit; end; FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi, LongRec(Time).Lo); Size := FindData.nFileSizeLow; Attr := FindData.dwFileAttributes; Name := FindData.cFileName; end; Result := 0; end; end. PS: Delphi 7 |
Re: Verzeichnis auslesen ohne SysUtils
ähm ich hab deinen qulltext bei mir reinkopiert und der funzt einwandfrei ^^
hab kurz drüber geschaut, aber keinen utnerschied erkennen können, hmm naja es funzt und das solls auch ^^ ich hab mir auch ma hoikas lösung angeschaut, die ist auch nicht schlecht FindFirstFile nutzt ne funktion aus der Windows Unit. |
Re: Verzeichnis auslesen ohne SysUtils
Zitat:
|
Re: Verzeichnis auslesen ohne SysUtils
@Daniel längst geschehen, Funktion mit FindFirstFile erstellt und den Post von vorhin editiert :P
|
Re: Verzeichnis auslesen ohne SysUtils
PS: in Delphi 7 Enterprise sind die Delphi-QuellCodes enthalten
- in der Sysutils nachsehn was FindFirst macht und schon wäre man von selber bei FindFirstFile gelandet. |
Re: Verzeichnis auslesen ohne SysUtils
:oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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