Recupérer la taille d'un fichier de 3Go en nbr d'octets

Résolu
coopertel Messages postés 12 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 8 février 2006 - 29 juil. 2004 à 18:11
BeLZeL Messages postés 110 Date d'inscription mardi 10 octobre 2000 Statut Membre Dernière intervention 20 décembre 2005 - 20 déc. 2005 à 17:28
Bonjour à tous,

Voilà mon problème :

J'ai un fichier de près de 3 Go (2.8 exactement).
Je désire connaître sa taille à l'octet près.
J'utilise pour cela (avec succès sur des fichiers plus petit) la fonction GetFileSize (qui renvoi au maximum un longint soit 2 milliard 100 millions en positif... soit 700 millions de moins que ce qu'il me faut pour stocker ma valeur...)

Chez MicroSoft, ils me disent d'utiliser GetFileSizeEx (mais cette fonction fonctionne uniquement sous win2000 et XP, or je suis sous le bon vieux NT 4.0 service pack 6 !!)

Bon voilà mon problème....

J'ai vu que FileSize (fct delphi) permet de renvoyer la taille d'un file of quelque chose...

Mais comme je fabrique des trucs génériques, ils doivent être capable de me donner une petite taille, comme une très grande taille, or si je fais un file of double word et FileSize, je serai baisse pour les fichiers de petites tailles....

Quelqu'un peut il appuyer sur l'interrupteur, c'est pas drôle d'éteindre la lumière !

A+

Merci

Coopertel.

6 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 juil. 2004 à 12:58
Bon, essaye donc cette "bidouille", vite fait pour répondre à ton problème.

J'utilise ici un TFileStream.

uses FileCtrl;

function GetFileSize(FileName: String): Int64;
var FS: TFileStream;
begin
  Result := 0;
  if not FileExists(FileName) then Exit;
  try
    FS := TFileStream.Create(FileName, fmOpenRead);
    Result := FS.Size;
  finally
    FS.Free;
  end;
end;


On peut vérifier que ça fonctionne en mettant sur sa fiche :

- 1 TLabel
- 1 TButton
- 1 TOpenDialog
- 1 TEdit

procedure TForm1.Button1Click(Sender: TObject);
var TailleFichier: Int64;
begin
  if OpenDialog1.Execute then
  begin
    Edit1.Text := OpenDialog1.FileName;
    TailleFichier := GetFileSize(OpenDialog1.FileName);
    Label1.Caption := IntToStr(TailleFichier);
  end;
end;


Bonne prog' :-p
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 juil. 2004 à 12:06
Qui peut le plus peut le moins...

A mon avis, tu n'as pas le choix :

Cardinal (étendue : 0..4294967295),
ou
Int64 (étendue : –2^63..2^63–1), le plus "confortable".

Bonne prog' :-p
0
coopertel Messages postés 12 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 8 février 2006
30 juil. 2004 à 12:14
Merci de ta réponse,

J'ai en effet mis le résultat de GetFileSize dans une variable de type Cardinal, je n'aurai pas de problème jusqu'a 4Go mais après je suis coincé...
Inutile de mettre le résultat de GetFileSize dans un INT64, la fonction ne renvoi qu'une valeur sur 32bits...
D'après l'API windows il existe une fonction GetFileSizeEx pour les fichiers "gros", mais elle tourne sous 2000 et je suis sous NT.

Donc je cherche une bidouille pour avoir la taille de mon fichier.

Quoi qu'il en soit j'avais sur les bras un fichier de 3Go donc Cardinal m'a temporairement sortie des ennuies...

Merci
0
coopertel Messages postés 12 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 8 février 2006
30 juil. 2004 à 15:10
Okey,

Ca marche bien.
La propriété Size du TFileStream est un INT64... Donc Je crois que je n'aurai plus de problème de taille de fichier (quoi que à l'échelle informatique tous est possible très vite, même si hier c'est de la science fiction...)

A+

et merci de ton aide.

Coopertel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 juil. 2004 à 17:16
Bah, avec un Int64, y'a encore de la marge, non ?
Quoique, avec la loi de Moore et toutes ces sortes de choses... :approve)

Pas de quoi, à +
0
BeLZeL Messages postés 110 Date d'inscription mardi 10 octobre 2000 Statut Membre Dernière intervention 20 décembre 2005
20 déc. 2005 à 17:28
La méthode dite précédemment est mauvaise dans certains cas.
L'ouverture de fichier fait perdre du temps (surtout si on ouvre un fichier distant, sur le réseau local).
De plus, la méthode est très lente si on veut faire un scan d'un répertoire.

Donc j'ai cherché et j'ai trouvé mieux :
http://delphi.developpez.com/faq/?page= fichier#taillefichier

<hr size="2" width="100%">
function TForm1.GetFileSize(const APath: string): int64;
var
Sr : TSearchRec;
begin
if FindFirst(APath,faAnyFile,Sr)=0 then
try
Result := Int64(Sr. FindData .nFileSizeHigh) shl 32 + Sr.FindData.nFileSizeLow;
finally
FindClose(Sr);
end
else
Result : = 0;
end;

<hr size="2" width="100%">Et si vous êtes déjà en train de scanner un répertoire avec un FindFirst, c'est encore plus simple. Utilisez directement votre TSearchRec :
ShowMessage ( IntToStr ( GetFileSize ( 'c:\windows\explorer.exe' ) ) );
0
Rejoignez-nous