function GetRealFileSize(
const aFileName:
string): Cardinal;
{**********************************************************}
// Diese Funktion ist von Daniel B. aus der Code-Library
// [url]http://www.delphipraxis.net/post52937.html#52937[/url]
// Es wird geprüft ob ein Windows auf NT-Basis läuft
function NTSystem: Boolean;
var
OsVinfo: TOSVERSIONINFO;
begin
result := False;
ZeroMemory(@OsVinfo, SizeOf(OsVinfo));
OsVinfo.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
if GetVersionEx(OsVinfo)
then
begin
if OsVinfo.dwPlatformId = VER_PLATFORM_WIN32_NT
then
begin
result := True;
end
end;
end;
{**********************************************************}
// Diese Funktion ist von Luckie aus der Code-Library
// [url]http://www.delphipraxis.net/post191286.html#191286[/url]
// Ermittelt die Grösse einer Datei
function GetFileSize(
const szFile:
String): Int64;
var
fFile: THandle;
wfd: TWIN32FINDDATA;
begin
result := 0;
if not FileExists(szFile)
then exit;
fFile := FindFirstfile(pchar(szFile),wfd);
if fFile = INVALID_HANDLE_VALUE
then exit;
result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
windows.FindClose(fFile);
end;
{**********************************************************}
var
ClusterSize: Cardinal;
SectorPerCluster: Cardinal;
BytesPerSector: Cardinal;
NumberOfFreeClusters: Cardinal;
TotalNumberOfClusters: Cardinal;
filesize: Cardinal;
realsize: Cardinal;
drive:
string;
begin
drive := ExtractFileDrive(aFileName) + '
\';
if (NTSystem)
then
begin
filesize := GetCompressedFileSize(PAnsiChar(aFileName), @filesize);
end
else
begin
filesize := GetFileSize (aFileName);
end;
realsize := 0;
if (filesize <> $FFFFFFFF)
then
begin
GetDiskFreeSpace(PChar(drive ), SectorPerCluster, BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters);
ClusterSize := SectorPerCluster * BytesPerSector;
if not ((filesize
mod clustersize) = 0)
then
begin
realsize := ((filesize
div clustersize) * clustersize) + clustersize
end
else
begin
realsize := filesize;
end;
end;
result := realsize;
end;