![]() |
Eigener FileExists Code funktioniert nicht richtig
Ich benutze folgenden Code für FileExists (um auf die SysUtils zu verzichten):
Delphi-Quellcode:
Funktioniert mit Dateien und Ordnern wunderbar. Nur wenn man ein Laufwerk angibt und die Funktion so aufruft:
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;
Delphi-Quellcode:
liefert sie False zurück, obwohl das Laufwerk existiert. Nur warum und wie kann man das beheben?
FileExists('d:\', True)
|
Re: Eigener FileExists Code funktioniert nicht richtig
eventuell wegen dem abschließenden Backslash
|
Re: Eigener FileExists Code funktioniert nicht richtig
Ich habe es auch schon ohne probiert, das hilft auch nichts.
|
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:
Gruß Hawkeye
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; |
Re: Eigener FileExists Code funktioniert nicht richtig
Ja das funktioniert. Ich habe jetzt aber noch das gefunden:
Delphi-Quellcode:
Und das kommt auch mit Laufwerken klar, wie es aussieht.
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; |
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).
|
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; |
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