Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Größe auf dem Datenträger ermitteln. (https://www.delphipraxis.net/32125-groesse-auf-dem-datentraeger-ermitteln.html)

morbo 19. Okt 2004 09:16


Größe auf dem Datenträger ermitteln.
 
Auf
DP
wird die Dateigrösse einer Datei ermittelt. Wie ermittele ich die Dateigröße auf dem Datenträger?

Gruß

Luckie 19. Okt 2004 09:42

Re: Größe auf dem Datenträger ermitteln.
 
Ich würde sagen, bis zu nächsten Cluster-Größe aufrunden. Frag mich aber nicht, wie man das macht.

Sharky 19. Okt 2004 09:58

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

Zitat von Luckie
Ich würde sagen, bis zu nächsten Cluster-Größe aufrunden. Frag mich aber nicht, wie man das macht.

So ;-)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ClusterSize: Cardinal;
  SectorPerCluster : Cardinal;
  BytesPerSector : Cardinal;
  NumberOfFreeClusters : Cardinal;
  TotalNumberOfClusters: Cardinal;
begin
  GetDiskFreeSpace(PChar('c:\'), SectorPerCluster,BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters);
  ClusterSize:=SectorPerCluster * BytesPerSector;
  ShowMessage (IntToStr (ClusterSize));
end;

Sharky 19. Okt 2004 10:22

Re: Größe auf dem Datenträger ermitteln.
 
Und jezt noch als Funktion :stupid:
Delphi-Quellcode:
function GetRealFileSize (const drive : Char; const filesize : Cardinal) : Cardinal;
var
  ClusterSize: Cardinal;
  SectorPerCluster : Cardinal;
  BytesPerSector : Cardinal;
  NumberOfFreeClusters : Cardinal;
  TotalNumberOfClusters: Cardinal;
  realsize : Cardinal;
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;
  result := realsize;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage (IntToStr (GetRealFileSize('c',4096)));
end;

Steve 19. Okt 2004 11:22

Re: Größe auf dem Datenträger ermitteln.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ajo, soweit funzt das ganz schön :D

...aaaaaber: Was ist, wenn die Datei komprimiert ist? Dann ist die Dateigröße ja größer als die Dateigröße auf dem Datenträger... (Anhang)
Und Delphi-Referenz durchsuchenGetDiskFreeSpace beachtet ja nicht die Kompression einzelner Dateien, sondern nur den gesamten Datenträger..

:arrow: Von daher sollte man anmerken, dass man Sharky's Funktion "GetRealFileSize" als Dateigröße das Ergebnis von Delphi-Referenz durchsuchenGetCompressedFileSize übergeben sollte :) :!:

edit: MSDN-Library durchsuchenGetCompressedFileSize ist vermutlich eh einfacher als oben erwähnte Funktionen

Gruß
Stephan :dance:

Sharky 19. Okt 2004 11:41

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

danke für den Hinweis (hihi ich kompriemiere nie die Laufwerke, darum habe ich das nicht bedacht).
So müsste es jetzt aber stimmen oder?
Delphi-Quellcode:
function GetRealFileSize (const aFileName : String) : Cardinal;
var
  ClusterSize: Cardinal;
  SectorPerCluster : Cardinal;
  BytesPerSector : Cardinal;
  NumberOfFreeClusters : Cardinal;
  TotalNumberOfClusters: Cardinal;
  filesize : Cardinal;
  realsize : Cardinal;
begin
  filesize := GetCompressedFileSize(PAnsiChar(aFileName),@filesize);
  GetDiskFreeSpace(PChar(afilename[1] +':\'), 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;
  result := realsize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  RealFileSize : Cardinal;
begin
  if (OpenDialog1.Execute) then
  begin
    RealFileSize := GetRealFileSize (OpenDialog1.FileName);
    ShowMessage (IntToStr (RealFileSize));
  end;
end;

Steve 19. Okt 2004 11:52

Re: Größe auf dem Datenträger ermitteln.
 
Jupp, läuft alles wie gewünscht :)
Man sollte evtl. noch prüfen, ob GetCompressedFileSize erfolgreich war (<> $FFFFFFFF) und ansonsten ne Fehlermeldung ausgeben.
Und evtl. lieber mit ExtractFileDrive arbeiten, falls Datei ohne Pfad übergeben wird.
Das dürft dann aber auch alles gewesen sein.. :zwinker:

PS: Läuft unter Win95 nicht korrekt, Begründung siehe OH :wink:

Gruß
Stephan :dance:

mirage228 19. Okt 2004 11:55

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

Zitat von Steve
PS: Läuft unter Win95 nicht korrekt, Begründung siehe OH :wink:

Eigentlich dürfte es überhaupt nicht, da GetCompressedFileSize() nur ab Win NT ff. verfügbar ist.

mfG
mirage228

Steve 19. Okt 2004 11:58

Re: Größe auf dem Datenträger ermitteln.
 
Ups, stimmt..
Hab jetzt nur bei GetDiskFreeSpace geguggt...
Nunja, dann funzt die Lösung mit GetCompressedFileSize also wohl nur ab NT aufwärts :pale: :angel:

Gruß
Stephan

morbo 19. Okt 2004 12:19

Re: Größe auf dem Datenträger ermitteln.
 
Danke für die schnelle Hilfe.

Gruß

Sharky 20. Okt 2004 08:51

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

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;

Steve 20. Okt 2004 09:17

Re: Größe auf dem Datenträger ermitteln.
 
Siehe auch Dateigröße auf Datenträger bestimmen für einen etwas anderen Lösungsansatz :) :angel:


Gruß
Stephan :dance:

Sharky 20. Okt 2004 09:41

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

Zitat von Steve
Siehe auch Dateigröße auf Datenträger bestimmen für einen etwas anderen Lösungsansatz ...

*Grummel*
Warum habe ich das übersehen? Da hätte ich mir die Arbeit heute sparen können ;-)

Steve 20. Okt 2004 09:45

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

Zitat von Sharky
Da hätte ich mir die Arbeit heute sparen können ;-)

:pale: 'Tschuldigung :duck:
Wollt's noch hier rein posten, habs aber wohl gestern bissl vergessen... :mrgreen:

Gruß
Stephan :dance:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 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