Einzelnen Beitrag anzeigen

Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Größe auf dem Datenträger ermitteln.

  Alt 20. Okt 2004, 08:51
Zitat von Steve:
Nunja, dann funzt die Lösung mit GetCompressedFileSize also wohl nur ab NT aufwärts
Hai Stephan

ich habe das ganze jetzt mal erweitert:
Delphi-Quellcode:
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat