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 |
Re: Dateigröße ermitteln ohne Datei zu öffnen
Zitat:
|
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.ä.)
|
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; |
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; |
Re: Dateigröße ermitteln ohne Datei zu öffnen
...aber dabei keine neuen Speicherlöcher erzeugen! :zwinker:
Delphi-Quellcode:
Gruß Hawkeye
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; |
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. ;) |
Re: Dateigröße ermitteln ohne Datei zu öffnen
Zitat:
|
Re: Dateigröße ermitteln ohne Datei zu öffnen
Zitat:
Zitat:
|
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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