Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm (https://www.delphipraxis.net/91692-rtlvcloptimize-2-77-delphispeedup-code-im-eigenen-programm.html)

jbg 3. Okt 2007 15:50

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von mirage228
Es sei denn es gibt noch mehr Fehler die GetLastError in dem Fall liefern könnte...

Das weiß wohl nur Microsoft. Wieso muss eigentlich GetFileAttributes schief gehen, wenn die Datei gesperrt ist. Ich will sie ja nicht öffnen. Aber das werden wir wohl nie erfahren.

jbg 3. Okt 2007 16:00

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.

jbg 3. Okt 2007 16:22

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;

bigg 3. Okt 2007 16:46

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:

Zitat von D7-RTL
function FileAge(const FileName: string): Integer;
var
Handle: THandle;
FindData: TWin32FindData;
LocalFileTime: TFileTime;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
if Handle <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(Handle);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
LongRec(Result).Lo) then Exit;
end;

end;
Result := -1;
end;


function FileExists(const FileName: string): Boolean;
begin
Result := FileAge(FileName) <> -1;
end;


jbg 3. Okt 2007 16:48

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von bigg
Wobei man dann gleich mit Windows.FindFirstFile arbeiten könnte.

Wenn du dein System ausbremsen willst, kannst du das ja gerne machen.

bigg 3. Okt 2007 17:36

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von jgb
Wenn du dein System ausbremsen willst, kannst du das ja gerne machen.

Jein.
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:

jbg 3. Okt 2007 17:47

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von bigg
Wobei deine Funktion im WorstCase (pagefile.sys) recht bescheiden weg kommt. *hüstel*

Die Frage ist wohl eher, wie oft man denn auf pagefile.sys prüft. In meinem ganzen Leben habe das nicht ein mal gemacht. Der Worst Case tritt bei mir also nie ein.

bigg 3. Okt 2007 18:02

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von jbg
Die Frage ist wohl eher, wie oft man denn auf pagefile.sys prüft. In meinem ganzen Leben habe das nicht ein mal gemacht. Der Worst Case tritt bei mir also nie ein.

Abwarten und Tee trinken heißt hier die Devise.
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.

jbg 3. Okt 2007 18:07

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
 
Zitat:

Zitat von bigg
btw: Das waren jetzt zwei ganze Seiten für eine poplige Funktion. :lol:

Zwei Seiten. Dann rate mal wie viele Tage und Wochen ich über eine schnellere Version von irgendwelchen RTL/VCL/IDE Funktionen brüte. Das was ihr immer seht, ist nur der bereits getestete Code.

bigg 3. Okt 2007 18:20

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.
Seite 4 von 5   « Erste     234 5      

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