AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm
Thema durchsuchen
Ansicht
Themen-Optionen

RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm

Ein Thema von jbg · begonnen am 8. Mai 2007 · letzter Beitrag vom 7. Mai 2008
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 14:50
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 15:00
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 15:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#4

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 15:46
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 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;
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 15:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#6

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 16:36
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.
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ß
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 16:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#8

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 17:02
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.
Aber der Aufwand hat sich gelohnt.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 17:07
Zitat von bigg:
btw: Das waren jetzt zwei ganze Seiten für eine poplige Funktion.
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.
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#10

Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr

  Alt 3. Okt 2007, 17:20
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 13:34 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