Delphi-PRAXiS
Seite 1 von 2  1 2      

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ß


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Seite 1 von 2  1 2      

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