Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateigröße ermitteln ohne Datei zu öffnen (https://www.delphipraxis.net/64563-dateigroesse-ermitteln-ohne-datei-zu-oeffnen.html)

marabu 5. Mär 2006 14:13

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Hallo Daniel,

wer die Implementierung von FileExists() kennt, der weiß, dass alle Sparversuche in diesem Code von Michael durch diesen einen Befehl wieder zunichte gemacht werden. Da ist dann mein VCL-Code noch sparsamer. FileExists() arbeitet intern mit FileAge() und dieses wiederum mit einem eigenen FindFirst-FindClose-Zyklus. Und außerdem wird die Prüfung von FindFirstFile() intern mit erledigt und das Ergebnis über den Rückgabewert signalisiert.

marabu

Daniel G 5. Mär 2006 14:25

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Zitat:

Zitat von marabu
FileExists() arbeitet intern mit FileAge() und dieses wiederum mit einem eigenen FindFirst-FindClose-Zyklus. Und außerdem wird die Prüfung von FindFirstFile() intern mit erledigt und das Ergebnis über den Rückgabewert signalisiert.

Ah, ok. Bei der PE sind die Sourcen ja nicht mit dabei, daher hatte ich auch keine Chance, mir das genauer anzusehen.

Flocke 5. Mär 2006 14:34

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Aber dann sollte man noch mit den Attributen in der FINDDATA-Struktur überprüfen, ob es sich wirklich um eine Datei handelt (und nicht um ein Verzeichnis o.ä.)

Luckie 5. Mär 2006 20:36

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Ups, das gehört noch dazu:
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : FileExists
// Comment  : -

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;

Flocke 5. Mär 2006 21:51

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Durch das FileExists rufst du so zwei mal hintereinander FindFirstFile für dieselbe Datei auf - du musst doch in GetFileSize nach dem FindFirstFile einfach nur noch auf FILE_ATTRIBUTE_DIRECTORY testen.
Delphi-Quellcode:
function GetFileSize(szFile: PChar): Int64;
var
  fFile            : THandle;
  wfd              : TWIN32FINDDATA;
begin
  result := -1;
  fFile := FindFirstfile(pchar(szFile), wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then exit;
  result := (wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

Hawkeye219 5. Mär 2006 22:12

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
...aber dabei keine neuen Speicherlöcher erzeugen! :zwinker:

Delphi-Quellcode:
function GetFileSize(szFile: PChar): Int64;
var
  fFile            : THandle;
  wfd              : TWIN32FINDDATA;
begin
  result := -1;
  fFile := FindFirstfile(pchar(szFile), wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    result := (wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;
Gruß Hawkeye

Luckie 5. Mär 2006 22:25

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Wo war bei Flocke das Speicherleck?

@Flocke: Die Routinen sind schon etwas älter und hab esie lange nicht gebraucht, deswegen habe ich sie mir schon lange nicht mehr angeguckt. ;)

Matze 5. Mär 2006 22:38

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Zitat:

Zitat von Luckie
Wo war bei Flocke das Speicherleck?

Nach FindFirstFile sollte immer ein FindClose folgen, was bei Flocke aufgrund des exits nicht mehr ausgeführt werden würde. Ich denke, das meinte Hawkeye.

Luckie 5. Mär 2006 23:02

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Luckie
Wo war bei Flocke das Speicherleck?

Nach FindFirstFile sollte immer ein FindClose folgen, was bei Flocke aufgrund des exits nicht mehr ausgeführt werden würde. Ich denke, das meinte Hawkeye.

Nein:
Zitat:

If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
Wenn sie fehlschlägt gibt es also kein Handle, das man schließen könnte. ;)

Matze 5. Mär 2006 23:05

Re: Dateigröße ermitteln ohne Datei zu öffnen
 
Ich dachte, ich hätte meinen Beitrag editiert und ein "(soweit ich weiß)" eingefügt, so klingt es, als sei ich fest davon überzeugt gewesen. :gruebel:

Zitat:

Zitat von Luckie
Wenn sie fehlschlägt gibt es also kein Handle, das man schließen könnte. ;)

Oh, wieder was gelernt, dann kann ich auch kein Speicherleck erkennen. Thx für die Info, werde ich mir merken. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
Seite 2 von 4     12 34      

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