AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Eigener FileExists Code funktioniert nicht richtig
Thema durchsuchen
Ansicht
Themen-Optionen

Eigener FileExists Code funktioniert nicht richtig

Ein Thema von Luckie · begonnen am 18. Mär 2007 · letzter Beitrag vom 18. Mär 2007
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 16:23
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:
FileExists('d:\', True) liefert sie False zurück, obwohl das Laufwerk existiert. Nur warum und wie kann man das beheben?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 16:48
eventuell wegen dem abschließenden Backslash
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 16:51
Ich habe es auch schon ohne probiert, das hilft auch nichts.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 16:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 17:11
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 17:35
wenn du explizit wissen willst ob es ein laufwerk ist solltest du auf Attribut 8 testen (ich glaub das stand für Volume).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 17:40
Wenn du dieses in OpenSource-Projekten einsetzen möchtes, dann wäre da was Einheitliches bestimmt angebracht:
Delphi-Quellcode:
Attr: Cardinal;
// oder
Code: Integer;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Eigener FileExists Code funktioniert nicht richtig

  Alt 18. Mär 2007, 18:01
Nun ja, dann müsste ich ganz schön viel überarbeiten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:32 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