Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FindFirstFile NIL übergeben? (https://www.delphipraxis.net/24884-findfirstfile-nil-uebergeben.html)

Pseudemys Nelsoni 28. Jun 2004 04:55


FindFirstFile NIL übergeben?
 
hallo,

ich möchte das handle einer datei per FindFirstFile bekommen, der erste Parameter ist der Pfad zur datei, der zweite ist ein record den die funktion mit daten füllt. Die daten sind aber für mich unwichtig, muss ich nun extra eine variable deklarieren um die funktion benutzen zu können? Weder NIL noch 0 geht....



EDIT:

ist das richtig so?:

Delphi-Quellcode:
hf := FindFirstFile(PChar(pfad), TWin32FindData(nil^));

Dax 28. Jun 2004 06:21

Re: FindFirstFile NIL übergeben?
 
Du musst leider eine Variable erzeugen und sie füllen lassen. Kannst ja den Inhalt gleich wieder löschen.

Oder erstelle zur Laufzeit einen Pointer, der als speicherbereich genau die Größe des Recortds umfasst.

Muetze1 28. Jun 2004 08:47

Re: FindFirstFile NIL übergeben?
 
Moin!

Und mal was anderes: was stellst du dir denn unter "Handle für eine Datei" vor? Bzw. was meinst du denn von der Funktion zurück zu bekommen? Das ist zumindest ein Suchhandle aber kein Filehandle zu der Datei...

Nur, bevor Missverständnisse auftreten...

MfG
Muetze1

Christian Seehase 28. Jun 2004 12:02

Re: FindFirstFile NIL übergeben?
 
Moin Pseudemys Nelsoni,

im zweiten Parameter soll die Funktion Informationen ablegen, und muss deshalb bei der Borland Deklaration, eine Variable sein.
FindFirstFile ist nichts anderes als die API Funktion zu FindFirst.

Was willst Du überhaupt machen?

Pseudemys Nelsoni 28. Jun 2004 14:07

Re: FindFirstFile NIL übergeben?
 
hallo christian,

ich möchte per API prüfen ob eine datei existiert, also so eine art "FileExists"

Christian Seehase 28. Jun 2004 14:12

Re: FindFirstFile NIL übergeben?
 
Moin Pseudemys Nelsoni,

nimm als zweiten Parameter einfach einen Dummy, da Dich in diesem Falle nicht interessiert, was die Funktion zurückliefert.
Ist der Rückgabewert dann INVALID_HANDLE_VALUE dürfte die Datei nicht existieren.
Zur Sicherheit könntest Du dann noch mit GetLastError prüfen, ob hier der Rückgabewert ERROR_FILE_NOT_FOUND ist.

War der Aufruf allerdings erfolgreich musst Du noch, mit FindClose, die Suche wieder schliessen.

Pseudemys Nelsoni 28. Jun 2004 14:22

Re: FindFirstFile NIL übergeben?
 
hallo christian, was heisst einen "dummy" ? sonst jedenfalls schonmal danke für die erklärung :)

MathiasSimmack 28. Jun 2004 14:23

Re: FindFirstFile NIL übergeben?
 
So ähnlich sieht die Funktion bei Borland aus:
Delphi-Quellcode:
function fileexists(const szFilename: string): boolean;
var
  Handle  : THandle;
  FindData : TWin32FindData;
begin
  Handle  := FindFirstFile(pchar(szFilename),FindData);
  Result  := (Handle <> INVALID_HANDLE_VALUE);

  if(Result) then Windows.FindClose(Handle);
end;
Funktioniert auch für Ordner. ;)

Luckie 28. Jun 2004 14:26

Re: FindFirstFile NIL übergeben?
 
Ich glaube, du solltest dir mal meine Toolbox ankucken -> http://www.luckie-online.de/Downloads/DelphiUnits/

Christian Seehase 28. Jun 2004 14:26

Re: FindFirstFile NIL übergeben?
 
Moin Mathias,

Zitat:

Zitat von MathiasSimmack
Funktioniert auch für Ordner.

wobei mir einfällt, dass die D5 Version von DirectoryExists unter ME nicht richtig funktioniert. :?

mirage228 28. Jun 2004 14:29

Re: FindFirstFile NIL übergeben?
 
Zitat:

Zitat von MathiasSimmack
So ähnlich sieht die Funktion bei Borland aus:
Delphi-Quellcode:
function fileexists(const szFilename: string): boolean;
var
  Handle  : THandle;
  FindData : TWin32FindData;
begin
  Handle  := FindFirstFile(pchar(szFilename),FindData);
  Result  := (Handle <> INVALID_HANDLE_VALUE);

  if(Result) then Windows.FindClose(Handle);
end;
Funktioniert auch für Ordner. ;)

Hi Mathias,

nicht ganz! Die Funktion von Borland prüft, ob FileAge(FileName) <> -1 ist.

Ich nehme aber an, dass das (bei Dateien zumindest) keinen Unterschied macht.

mfG
mirage228

MathiasSimmack 28. Jun 2004 14:36

Re: FindFirstFile NIL übergeben?
 
@mirage: Deswegen schrieb ich ja auch:
Zitat:

Zitat von MathiasSimmack
So ähnlich sieht die Funktion bei Borland aus:

Wenn du nämlich auf den Kram mit dem letzten Dateizugriff verzichten kannst, und auch auf die Einschränkung, dass nur Dateien berücksichtigt werden, dann kannst du "fileexists" auf die o.g. 3 Zeilen zusammenkürzen.

@Christian: Meinst du die Implementierung von Borland, oder den von mir o.g. Weg? Von ersterer habe ich mir den Quellcode noch nicht angesehen (gleich mal machen, muss bloß zum Schrank ... die CD holen), bei letzterer wüsste ich im Moment jetzt keinen Grund warum es nicht gehen sollte.


@Luckie: Damit wären wir wieder beim Thema. Pseudemys Nelsoni gehört zu denen, die das Rad ständig neu erfinden müssen ... ;)

Christian Seehase 28. Jun 2004 14:44

Re: FindFirstFile NIL übergeben?
 
Moin Mathias,

ja, ich meine die von Borland.
Nachdem ich die durch eine eigene Variante ersetzt hatte ging's.

Sieht fast genau so aus wie Deine, nur mit CreateFile.

Pseudemys Nelsoni 28. Jun 2004 14:51

Re: FindFirstFile NIL übergeben?
 
guck ich mir an luckie.


Zitat:

Pseudemys Nelsoni gehört zu denen, die das Rad ständig neu erfinden müssen ...
:mrgreen: Wie meinste denn das? ich kenn keine fileexists function die ohne VCL funzt :P

MathiasSimmack 28. Jun 2004 14:57

Re: FindFirstFile NIL übergeben?
 
Also, ich habe eben mal nachgeschaut. In D5 benutzt Borland die API-Funktion "GetFileAttributes":
Delphi-Quellcode:
function DirectoryExists(const Name: string): Boolean;
var
  Code: Integer;
begin
  Code := GetFileAttributes(PChar(Name));
  Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
Jetzt wäre aber die Frage, warum das bei Windows ME nicht klappen soll. Im PSDK finden sich jedenfalls keine speziellen Hinweise zu ME. Bei Delphi 7 sieht die Funktion aber genauso aus wie oben gezeigt. Demzufolge müsste ein D7-Programm das gleiche Problem haben. Hat jemand ME und kann das bestätigen?

Ansonsten würde ich, wenn´s unbedingt eine eigene Funktion für Verzeichnisse sein soll, folgendes vorschlagen:
Delphi-Quellcode:
function DirectoryExists(const Directory: string): boolean;
var
  Handle  : THandle;
  FindData : TWin32FindData;
begin
  Handle  := FindFirstFile(pchar(Directory),FindData);
  Result  := (Handle <> INVALID_HANDLE_VALUE) and
    (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0);

  if(Handle <> INVALID_HANDLE_VALUE) then
    Windows.FindClose(Handle);
end;
@Pseudemys Nelsoni: Doch, denn "FileExists" hat nichts mit der VCL zu tun. Du kannst die SysUtils- und ähnliche Units auch in nonVCL/Konsolenprojekte einbinden. Es ist eben nur so, dass das Programm dadurch etwas größer wird, weil im Hintergrund bestimmte Dinge initialisiert werden, usw.
Wenn du auch auf die SysUtils usw. verzichten willst, dann kommst du um die API-Funktionen nicht herum.

Und mit "Rad neu erfinden" meine ich, dass du bspw. Fragen stellst, die ich (bei Kenntnis der Win32-API-Tutorials als Beispiel) nicht stellen würde, weil du dort schon die Antworten findest. Zudem liegen bei den Samples der Tutorials ebenfalls diverse erweiterte bzw. gepatchte Units bei. Eine davon enthält auch die o.g. "fileexists"-Funktion.

Pseudemys Nelsoni 28. Jun 2004 15:17

Re: FindFirstFile NIL übergeben?
 
Zitat:

@Pseudemys Nelsoni: Doch, denn "FileExists" hat nichts mit der VCL zu tun. Du kannst die SysUtils- und ähnliche Units auch in nonVCL/Konsolenprojekte einbinden. Es ist eben nur so, dass das Programm dadurch etwas größer wird, weil im Hintergrund bestimmte Dinge initialisiert werden, usw.
genau das wollte ich auch vermeiden ;)


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