Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Verzeichnis auslesen ohne SysUtils (https://www.delphipraxis.net/148967-verzeichnis-auslesen-ohne-sysutils.html)

jokerfacehro 11. Mär 2010 13:27


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 ?

jokerfacehro 11. Mär 2010 13:37

Re: Verzeichnis auslesen ohne SysUtils
 
hab grad was gefunden

Delphi-Quellcode:
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;
allerdings brauch ich dafür ne listbox :/

kann ich der message auch nen WindowHandle zuweisen und das dann abfangen ?

hoika 11. Mär 2010 13:53

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

rollstuhlfahrer 11. Mär 2010 13:55

Re: Verzeichnis auslesen ohne SysUtils
 
Zitat:

Zitat von jokerfacehro
ich hab versucht die benötigten funktionen direkt aus der SysUtils zu übernehmen,allerdings spinnt seitdem mein debugger.

zeigt nur noch unsinn naja.

Kann eigentlich nicht sein. Delphi macht ja intern auch was, ohne Fenster. Als erstes würde ich dir raten, dies alles in eine externe Unit (am Besten noch mit dem Namen FindFileNonVCL) auszulagern. Dann hast du es einfacher, später Fehlerquellen zu finden. Weiterhin musst du halt schauen, ob die Handles alle so stimmen. Delphi macht ja im Grunde nichts anderes, als den Zugriff auf die Windows-API zu kapseln.

Bernhard

hoika 11. Mär 2010 13:57

Re: Verzeichnis auslesen ohne SysUtils
 
Hallo,

wolln mal nicht so sein.

FindFirstFile


Heiko

jokerfacehro 11. Mär 2010 14:02

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

jokerfacehro 11. Mär 2010 14:02

Re: Verzeichnis auslesen ohne SysUtils
 
Zitat:

Zitat von hoika
Hallo,

wolln mal nicht so sein.

FindFirstFile


Heiko

ähm was soll ich damit ?


Edit: hab mich verlesen, hab erst nur FindFirst gelesen ^^

FindFirstFile ist eine gute Alternative zu FindFirst und basiert auf der Windows Unit

Bernhard Geyer 11. Mär 2010 14:05

Re: Verzeichnis auslesen ohne SysUtils
 
Zitat:

Zitat von jokerfacehro
@rollstuhlfahrer

genau das hab ich gemacht, allerdings gibt'S da einige platformabhängige konstanten und so weiter, da meckert er nacher rum

Dann schalte doch diese Warnungen aus ({$WARN UNIT_PLATFORM OFF} {$WARN SYMBOL_PLATFORM OFF}). Warn mal für Kylix/CXL gedacht, aber das ist gestorben. Und was die neue portierbarkeit betrieft fließt noch einiges Wasser den Bach hinunter.

rollstuhlfahrer 11. Mär 2010 14:08

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

jokerfacehro 11. Mär 2010 14:10

Re: Verzeichnis auslesen ohne SysUtils
 
ok, so sieht meine unit aus

Delphi-Quellcode:
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.
das komische ist, er zeigt da nen fehler an unzwar: Missing parameter type;

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


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