Récupérer la taille des gros fichiers (> 2Go) [Résolu]

Signaler
Messages postés
32
Date d'inscription
mercredi 10 janvier 2007
Statut
Membre
Dernière intervention
1 septembre 2015
-
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
Bonjour,

voici mon problème, je cherche à récupérer l'information de la taille des fichiers.

Jusque là c'est très simple, l'extrait de code suivant va chercher la taille de tous les fichiers contenus dans un dossier désigné en cliquant dans une arborescence et les range dans dans une variable tableau à une dimension. (j'ai mis le minimum de code pour ma question mais je récupère bien sûr le nom, la date , les attributs, ...).

Ce qui ne va pas, c'est que fichier.Size est un integer donc limité à 2 147 483 647 (quelque chose comme ça), donc à des fichiers de environ 2 Go. J'ai pu constaté que les valeurs sont effectivement n'importe quoi pour les très gros fichiers (> 2 Go), c'est pourquoi j'ai essayé de passer en Int64 ma variableVF_TAILLE mais cela ne change rien vu que le problème vient entièrement de Fichier.Size.

Du coup, je ne sais plus trop comment faire. Je sais que cette question peut paraître très simple mais je n'en trouve pas la réponse... merci par avance

ce code a été écrit avec delphi 6 standard.
var
  VF_TAILLE: array of Int64;
  Pointeur: Word;
  Fichier: TSearchRec;
begin
Try
  RefDossier :=  TREE.Path;
  RefDossier := IncludeTrailingPathDelimiter(RefDossier); {très important}
  if FindFirst(RefDossier + '*.*',faAnyFile,Fichier) = 0 Then
    Begin
      Repeat
        if (Fichier.Attr And faDirectory) = 0 Then
          Try
            Inc(Pointeur);
            SetLength(VF_TAILLE,Pointeur);
            VF_TAILLE[Pointeur - 1] := Int64(Fichier.Size);
          Except
          end;
      Until FindNext(Fichier) <> 0;
      FindClose(Fichier);
    end;
Except
end;

md21

5 réponses

Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
11
Salut,

Dans la JCL, tu as cette fonction :
function GetSizeOfFile(const FileName: string): Int64;
var
  Handle: THandle;
  FindData: TWin32FindData;
  Size: TULargeInteger;
begin
  Result := 0;
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    Size.LowPart := FindData.nFileSizeLow;
    Size.HighPart := FindData.nFileSizeHigh;
    Result := Size.QuadPart;
  end
  else
    RaiseLastOSError;
end;

En espérant que ça t'aidera.

Simon
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Salut !

Il faut "juste" que tu remplaces ta ligne "VF_TAILLE[Pointeur - 1] := Int64(Fichier.Size);" en utilisant la fonction GetFileSizeEx() [windows xp/vista uniquement].

Il faut pour cela que tu ouvres le fichier via CreateFile() , que tu récupères la taille, puis que tu le refermes via CloseHandle().

Voici quelques liens:
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa364957(VS.85).aspx

A+
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008

Ahh simon m'a coupé l'herbe sous le pied.
Mais au moins, sa fonction est toute prête.http://www.mx-dev.net
Messages postés
32
Date d'inscription
mercredi 10 janvier 2007
Statut
Membre
Dernière intervention
1 septembre 2015
1
un grand merci à tous les deux !
cette fonction marche impeccable, je ne la connaissais pas

bonne journée
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
11
A Flo : Dans l'Ouest, tu serais mort...

Simon