Einzelnen Beitrag anzeigen

Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#1

Dateigröße auf Datenträger bestimmen

  Alt 19. Okt 2004, 14:28
Hi,

habe Sharky's Code (Link) mal weiter ausgebaut:

Delphi-Quellcode:
function GetRealFileSize (const aFileName : string) : Int64;
{ - Returns real size of a file on the disk (in bytes)                       }
{ - aFileName is the name of the file that shall be checked, including path  }
{ - Works with every version of Windows - but under Win 9x the result may be }
{   inaccurate because GetDiskFreeSpace returns an incorrect value           }
{   (See Microsoft Platform SDK for details)                                 }
{ - Also works with compressed files                                         }
{ - If an error occurs, the Result is negative                               }
var
  ClusterSize : Cardinal;
  SectorPerCluster : Cardinal;
  BytesPerSector : Cardinal;
  NumberOfFreeClusters : Cardinal;
  TotalNumberOfClusters : Cardinal;
  FileSize : Cardinal;
  RealSize : Cardinal;
  FileHandle : Cardinal;
  OSVersInfo : OSVersionInfo;
  Drive : AnsiString;
begin
  Result := -1;
  FileHandle := 0;
  { Check file }
  if not FileExists(aFileName) then Exit;
  { Check version of operating system }
  OSVersInfo.dwOSVersionInfoSize := SizeOf(OSVersInfo);
  if not GetVersionEx(OSVersInfo) then Exit;
  { Windows NT, 2000, XP, 2003 }
  if OSVersInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
  begin
    FileSize := GetCompressedFileSize(PAnsiChar(aFileName), @FileSize);
    { Check for errors }
    if FileSize=$FFFFFFFFthen
    begin
      MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK or MB_ICONERROR);
    end;
  end else
  { Windows 95, 98, ME }
    try
      FileHandle := CreateFile(PChar(aFileName),
                               GENERIC_READ,
                               FILE_SHARE_READ,
                               nil,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               0);
      FileSize := GetFileSize(FileHandle,@FileSize);
      { Check for errors }
      if FileSize=$FFFFFFFF then
      begin
        MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK or MB_ICONERROR);
      end;
  finally
    FileClose(FileHandle);
  end;
  { Check number of bytes per cluster }
  Drive := ExtractFileDrive(aFileName);
  if Drive[Length(Drive)]<>'\then Drive := Drive+'\';
  if not GetDiskFreeSpace(PChar(Drive),
                          SectorPerCluster,
                          BytesPerSector,
                          NumberOfFreeClusters,
                          TotalNumberOfClusters) then
  begin
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK or MB_ICONERROR);
    Exit;
  end;
  ClusterSize := SectorPerCluster * BytesPerSector;
  { Calculate real size of file }
  if not ((FileSize mod ClusterSize) = 0) then
  begin
   RealSize := ((FileSize div ClusterSize) * ClusterSize) + ClusterSize
  end else
  begin
   RealSize := FileSize;
  end;
  { Return the real size }
  Result := RealSize;
end;
Beschrieben is ja soweit alles.
Getestet unter Win 98 SE, 2000 Prof., XP Prof.
edit: Bei Fehler negativer Rückgabewert, thx@sakura

Gruß
Stephan

[edit=Matze]Code formatiert. Mfg, Matze[/edit]
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat