Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   GetFileSizeEx gibt falsche werte bei großen Dateien (https://www.delphipraxis.net/153889-getfilesizeex-gibt-falsche-werte-bei-grossen-dateien.html)

Cylence 19. Aug 2010 08:22

GetFileSizeEx gibt falsche werte bei großen Dateien
 
Hallo,

die Funktion GetFileSizeEx gibt mir bei großen Dateien über 1 Gb absolut falsche werte zurück, bei einem 6Gb File zeigt es 1gb an, ein 5 Gb File zeigt 300 Mb und ein 4 Gb File zeigt 2 Gb. Kennt jemand das Problem? Betriebssystem hier ist windows vista 32



Delphi-Quellcode:

function GetFileSizeEx(const AFileName: string): Int64;
var
  F: TSearchRec;
begin
  Result := -1;
  if FindFirst(AFileName, faAnyFile, F) = 0 then
  begin
    try
      Result := F.FindData.nFileSizeLow or (F.FindData.nFileSizeHigh shl 32);
    finally
      SysUtils.FindClose(F);
    end;
  end;
end;

ist daran etwas falsch?

DeddyH 19. Aug 2010 08:28

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Wie wäre es hiermit?
http://www.delphipraxis.net/24331-da...ermitteln.html

Cylence 19. Aug 2010 08:46

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Hi,

danke :-) hatte nach getfilesizeex gesucht da hab ich das nicht gefunden *g* danke Dir! Werd die Versionen ausprobieren.

Gruß

Tom

himitsu 19. Aug 2010 10:25

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
F.FindData.nFileSizeHigh erst auf 64 Bit vergrößern und dann schiften, denn wo sollen die Bits sonst hin?
Delphi-Quellcode:
Result := F.FindData.nFileSizeLow or (Int64(F.FindData.nFileSizeHigh) shl 32);
.

PS: solch einfache Bit-Operationen sollten keine Probleme bereten, weswegen der Resourceschutzblock unnötig wäre.

PSS:
Delphi-Quellcode:
function GetFileSizeEx(const AFileName: string): Int64;
var
  F: TSearchRec;
begin
  if FindFirst(AFileName, faAnyFile, F) = 0 then
  begin
    Int64Rec(Result).Lo := F.FindData.nFileSizeLow;
    Int64Rec(Result).Hi := F.FindData.nFileSizeHigh;
    SysUtils.FindClose(F);
  end
  else
    Result := -1;
end;

hathor 9. Mai 2014 17:12

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Kleine Änderung für XE2:

Delphi-Quellcode:
function GetFileSizeEx(const AFileName: string): Int64;
var
  F: TSearchRec;
begin
  if FindFirst(AFileName, faAnyFile, F) = 0 then
  begin
    Int64Rec(Result).Lo := F.FindData.nFileSizeLow;
    Int64Rec(Result).Hi := F.FindData.nFileSizeHigh;
    System.SysUtils.FindClose(F);//       <-----------------
  end
  else
    Result := -1;
end;

Bernhard Geyer 9. Mai 2014 17:49

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Zitat:

Zitat von hathor (Beitrag 1258461)
Kleine Änderung für XE2:
...

Wieso überhaupt Namespaceangaben. FindClose wird auch ohne (WinApi.)SysUtils.-Prefix gefunden.
Sonst würde auch FindFirst nicht gefunden werden.

Also entweder alles mit Prefix oder gar nix.

himitsu 9. Mai 2014 17:56

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Weil das eine universelle Funktion ist und oftmals zuerst das FindClose aus der SysUtils gefunden wird, wo es dann heißt "Parameter ist falsch".

[edit]
Ups, genau andersrum ... ich meinte das FindClose aus der WinApi.Windows .

Popov 9. Mai 2014 18:47

AW: GetFileSizeEx gibt falsche werte bei großen Dateien
 
Obwohl die Frage für den TE bereits beantwortet wurde, vielleicht doch noch die Antwort auf die Frage:
Zitat:

Zitat von Cylence (Beitrag 1043291)
ist daran etwas falsch?

Delphi-Quellcode:
...
      Result := F.FindData.nFileSizeLow or (F.FindData.nFileSizeHigh shl 32);
...
SHL 32 schiebt alles um 32 Bit nach links. So wie es ist, ist das Ergebnis aber ein 32Bit Integer. Somit werden die 32 Bits ins Nichts geschoben und man erhält ein falsches Ergebnis.

Ohne das jetzt nachzuprüfen, das sollte das Problem beseitigen:
Delphi-Quellcode:
...
      Result := Int64(F.FindData.nFileSizeLow) or (Int64(F.FindData.nFileSizeHigh) shl 32);
...
//EDIT

Ups, sehe gerade, himitsu hat schon drauf hingewiesen. Sorry, hab nicht alle Beitröge vorher gelesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz