![]() |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Das mit ACCESS_DENIED ist so eine Sache. Wenn man auf ein Verzeichnis zugreift, auf das man keine Leserechte hat, bekommt man auch ein Access Denied zurück.
Also wenn man auf die Datei 'C:\Gesperrt\NichtVorhanden.txt' prüfen will und man keine Leserechte in "Gesperrt" hat, dann kommt ACCESS_DENIED zurück, auch wenn die Datei nicht existiert. Wenn man nun True zurückliefern würde, könnte das Fatale Folgen haben. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Wie wäre es mit dieser Funktion:
Delphi-Quellcode:
function FileExists(const Filename: string): Boolean;
function FailSafe(const Filename: string): Boolean; var FindData: TWin32FindData; h: THandle; begin { Either the file is locked/share_exclusive or we got an access denied } h := FindFirstFile(PChar(Filename), FindData); if h <> 0 then begin Windows.FindClose(h); Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0; end else Result := False; end; var Code: Integer; LastError: Cardinal; begin Code := Integer(GetFileAttributes(Pointer(FileName))); if Code <> -1 then Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0) else begin LastError := GetLastError(); Result := (LastError <> ERROR_FILE_NOT_FOUND) and (LastError <> ERROR_PATH_NOT_FOUND) and FailSafe(Filename); end; end; |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Die von dir gepostete Version macht bei mir keine Anstalten. Wobei man dann gleich mit Windows.FindFirstFile arbeiten könnte.
Zur Übersicht, hier noch die D7-Original-Fassung: Der rot eingefärbte Teil könnte raus. Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
Der Leistungsgewinn von etwa 100% überzeugen mich dann doch. :mrgreen: Wobei deine Funktion im WorstCase (pagefile.sys) recht bescheiden weg kommt. *hüstel*
Delphi-Quellcode:
function RTL_MOD_FileExists(const FileName: String): Boolean;
var Handle: THandle; FindData: TWin32FindData; begin Result := False; Handle := Windows.FindFirstFile(PChar(FileName), FindData); if Handle <> INVALID_HANDLE_VALUE then begin Result := ( (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 ); Windows.FindClose(Handle); end; end; function jgbFileExists(const Filename: string): Boolean; function FailSafe(const Filename: string): Boolean; var FindData: TWin32FindData; h: THandle; begin { Either the file is locked/share_exclusive or we got an access denied } h := Windows.FindFirstFile(PChar(Filename), FindData); if h <> 0 then begin Windows.FindClose(h); Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0; end else Result := False; end; var Code: Integer; LastError: Cardinal; begin Code := Integer(Windows.GetFileAttributes(Pointer(FileName))); if Code <> -1 then Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0) else begin LastError := Windows.GetLastError(); Result := (LastError <> ERROR_FILE_NOT_FOUND) and (LastError <> ERROR_PATH_NOT_FOUND) and FailSafe(Filename); end; end; procedure TForm1.Button1Click(Sender: TObject); var b: Boolean; i: Integer; Start: Cardinal; s, FileName: String; begin i := 0; Start := Windows.GetTickCount; //FileName := 'C:\pagefile.sys'; FileName := 'C:\boot.ini'; repeat //b := jgbFileExists(FileName); b := MyFileExists(FileName); inc(i); until (i > 100000); if b then s := 'True' else s := 'False'; ShowMessage( IntToStr(Windows.GetTickCount - Start) + ' ms' + #13#10 + s); end; Gruß :hi: |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
Wobei es ja nicht nur um die Pagefile.sys ging, sondern eher um den vielleicht eintreffenden Fehlerfall, sprich die Datei ist geöffnet, schreibgeschützt und andere Prozesse dürfen auf sie nicht zugreifen. Das das der seltenste Fall sein dürfte, wissen wir ja beide. btw: Das waren jetzt zwei ganze Seiten für eine poplige Funktion. :lol: Aber der Aufwand hat sich gelohnt. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Klar, das war auch keine Beschwerde meinerseits. Im übrigen kenne ich die Problemmatiken des Programmierens.
Insbesondere wenn man mehrere Anwendungen entwickelt, da sitzt man schon ein paar Jährchen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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 by Thomas Breitkreuz