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

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

japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 30 juil. 2004 à 12:58
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 30 juil. 2004 à 12:06
0
Utile
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
coopertel 12 Messages postés jeudi 29 juillet 2004Date d'inscription 8 février 2006 Dernière intervention - 30 juil. 2004 à 12:14
0
Utile
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
coopertel 12 Messages postés jeudi 29 juillet 2004Date d'inscription 8 février 2006 Dernière intervention - 30 juil. 2004 à 15:10
0
Utile
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
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 30 juil. 2004 à 17:16
0
Utile
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
BeLZeL 110 Messages postés mardi 10 octobre 2000Date d'inscription 20 décembre 2005 Dernière intervention - 20 déc. 2005 à 17:28
0
Utile
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.