AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verzeichnis auslesen ohne SysUtils
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichnis auslesen ohne SysUtils

Ein Thema von jokerfacehro · begonnen am 11. Mär 2010 · letzter Beitrag vom 11. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#1

Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 13:27
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 ?
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 13:37
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 ?
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 13:53
Hallo,

geh mal zu Msdn und fange bei CreateFile an zu suchen
(das wird auch zum Öffnen von Dateien und Verzeichnissen benutzt).


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 13:55
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 13:57
Hallo,

wolln mal nicht so sein.

FindFirstFile


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 14:02
@rollstuhlfahrer

genau das hab ich gemacht, allerdings gibt'S da einige platformabhängige konstanten und so weiter, da meckert er nacher rum
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 14:02
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
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 14:05
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#9

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 14:08
ü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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Verzeichnis auslesen ohne SysUtils

  Alt 11. Mär 2010, 14:10
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


Edit: setze ich die Konstanten direkt unter uses, tritt der fehler beim TsearchRec auf
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.
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