Recupérer la taille d'un fichier de 3Go en nbr d'octets [Résolu]

Messages postés
12
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
8 février 2006
- 29 juil. 2004 à 18:11 - Dernière réponse :
Messages postés
110
Date d'inscription
mardi 10 octobre 2000
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.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
30 juil. 2004 à 12:58
3
Merci
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

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de japee
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
30 juil. 2004 à 12:06
0
Merci
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
Commenter la réponse de japee
Messages postés
12
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
8 février 2006
30 juil. 2004 à 12:14
0
Merci
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
Commenter la réponse de coopertel
Messages postés
12
Date d'inscription
jeudi 29 juillet 2004
Dernière intervention
8 février 2006
30 juil. 2004 à 15:10
0
Merci
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
Commenter la réponse de coopertel
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
30 juil. 2004 à 17:16
0
Merci
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, à +
Commenter la réponse de japee
Messages postés
110
Date d'inscription
mardi 10 octobre 2000
Dernière intervention
20 décembre 2005
20 déc. 2005 à 17:28
0
Merci
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' ) ) );
Commenter la réponse de BeLZeL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.