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/)
-   -   Eigener FileExists Code funktioniert nicht richtig (https://www.delphipraxis.net/88632-eigener-fileexists-code-funktioniert-nicht-richtig.html)

Luckie 18. Mär 2007 15:23


Eigener FileExists Code funktioniert nicht richtig
 
Ich benutze folgenden Code für FileExists (um auf die SysUtils zu verzichten):
Delphi-Quellcode:
function FileExists(const FileName: string; dir: boolean = false): Boolean;
var
  hidate, lodate   : word;
  Handle           : THandle;
  FindData         : TWin32FindData;
  LocalFileTime    : TFileTime;

type
  LongRec = packed record
    Lo, Hi: Word;
  end;

  function SubFileExists: Boolean;
  begin
    FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
    result := FileTimeToDosDateTime(LocalFileTime, HiDate, LoDate);
  end;
begin
  result := false;
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    case dir of
      TRUE: if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
          result := SubFileExists;
      FALSE: if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
          result := SubFileExists;
    end;
  end;
end;
Funktioniert mit Dateien und Ordnern wunderbar. Nur wenn man ein Laufwerk angibt und die Funktion so aufruft:
Delphi-Quellcode:
FileExists('d:\', True)
liefert sie False zurück, obwohl das Laufwerk existiert. Nur warum und wie kann man das beheben?

SirThornberry 18. Mär 2007 15:48

Re: Eigener FileExists Code funktioniert nicht richtig
 
eventuell wegen dem abschließenden Backslash

Luckie 18. Mär 2007 15:51

Re: Eigener FileExists Code funktioniert nicht richtig
 
Ich habe es auch schon ohne probiert, das hilft auch nichts.

Hawkeye219 18. Mär 2007 15:58

Re: Eigener FileExists Code funktioniert nicht richtig
 
Hallo Michael,

ich vermute, daß er ohne Backslash das aktuelle Verzeichnis des angegebenen Laufwerks nimmt. Kann man mit FindFirstFile überhaupt Laufwerke überprüfen?

Hier ist eine mögliche Alternative:

Delphi-Quellcode:
function FileExists (const FileName: string; dir: Boolean = False): Boolean;
var
  HiDate, LoDate : Word;
  Handle        : THandle;
  FindData      : TWin32FindData;
  LocalFileTime : TFileTime;
begin
  if (GetDriveType(PChar(FileName)) in [0, 1]) then
    begin
      Result := False;
      Handle := FindFirstFile(PChar(FileName), FindData);
      if (Handle <> INVALID_HANDLE_VALUE) then
        begin
          Windows.FindClose(Handle);
          if (((FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) = dir) then
            begin
              FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
              Result := FileTimeToDosDateTime(LocalFileTime, HiDate, LoDate);
            end;
        end;
    end
  else
    Result := dir;
end;
Gruß Hawkeye

Luckie 18. Mär 2007 16:11

Re: Eigener FileExists Code funktioniert nicht richtig
 
Ja das funktioniert. Ich habe jetzt aber noch das gefunden:
Delphi-Quellcode:
function FileExists(const FileName: string): Boolean;
var
  Attr: Cardinal;
begin
  Attr := GetFileAttributes(Pointer(Filename));
  Result := (Attr <> $FFFFFFFF) and (Attr and FILE_ATTRIBUTE_DIRECTORY = 0);
end;

function DirectoryExists(const Directory: string): Boolean;
var
  Code: Integer;
begin
  Code := GetFileAttributes(PChar(Directory));
  Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
Und das kommt auch mit Laufwerken klar, wie es aussieht.

SirThornberry 18. Mär 2007 16:35

Re: Eigener FileExists Code funktioniert nicht richtig
 
wenn du explizit wissen willst ob es ein laufwerk ist solltest du auf Attribut 8 testen (ich glaub das stand für Volume).

himitsu 18. Mär 2007 16:40

Re: Eigener FileExists Code funktioniert nicht richtig
 
Wenn du dieses in OpenSource-Projekten einsetzen möchtes, dann wäre da was Einheitliches bestimmt angebracht:
Delphi-Quellcode:
Attr: Cardinal;
// oder
Code: Integer;

Luckie 18. Mär 2007 17:01

Re: Eigener FileExists Code funktioniert nicht richtig
 
Nun ja, dann müsste ich ganz schön viel überarbeiten. ;)


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