Delphi-PRAXiS
Seite 2 von 2     12   

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)

rollstuhlfahrer 11. Mär 2010 14:16

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.

jokerfacehro 11. Mär 2010 14:20

Re: Verzeichnis auslesen ohne SysUtils
 
Zitat:

Zitat von rollstuhlfahrer
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.

kommt genau das gleiche verhalten

rollstuhlfahrer 11. Mär 2010 14:30

Re: Verzeichnis auslesen ohne SysUtils
 
Folgendes läuft bei mir ohne Fehler:
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;
  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.
Bernhard

PS: Delphi 7

jokerfacehro 11. Mär 2010 14:36

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.

Mithrandir 11. Mär 2010 14:36

Re: Verzeichnis auslesen ohne SysUtils
 
Zitat:

Zitat von jokerfacehro
ähm was soll ich damit ?

Link anklicken und die Arbeitsweise von FindFirstFile verstehen... :wall: Dann kann man sich die ganzen benötigten Konstanten nämlich selbst zusammenschustern.

jokerfacehro 11. Mär 2010 14:39

Re: Verzeichnis auslesen ohne SysUtils
 
@Daniel längst geschehen, Funktion mit FindFirstFile erstellt und den Post von vorhin editiert :P

himitsu 11. Mär 2010 14:51

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.

jokerfacehro 11. Mär 2010 14:53

Re: Verzeichnis auslesen ohne SysUtils
 
:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Seite 2 von 2     12   

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