bonjour, je souhaite recuperer la taille d'un fichier! tous simplement.
impossible de trouver ca! (aucune source)
merci d'avance, merci!
bonjour, je souhaite recuperer la taille d'un fichier! tous simplement.
impossible de trouver ca! (aucune source)
merci d'avance, merci!
Essayes FileSize
Dans la faq Delphi, il y a aussi des exemples qui font appel à l'api windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var f: file of Byte; size : Longint; S: string; begin if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Reset(f); size := FileSize(f); S := ' Taille du fichier ' + Format('%.2f',[(size / 1024)])+ ' ko'; ShowMessage(s); CloseFile(f); end; end; end.
• Il vaut mieux utiliser la solution suivante, surtout si tu veux pouvoir obtenir la taille de gros fichier > 4 Go (Int64) :
http://delphi.developpez.com/faq/?pa...#taillefichier
• Je connais une autre méthode sans ouvrir le fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Function GetFileSizeEx(Const filename: String): Int64; Var SRec: TSearchrec; converter: Packed Record Case Boolean Of False: (n: int64); True: (low, high: DWORD); End; Begin Result := -1; If (FindFirst(filename, faAnyfile, SRec) = 0) Then Begin converter.Low := SRec.FindData.nFileSizeLow; converter.High := SRec.FindData.nFileSizeHigh; Result := converter.n; FindClose(SRec); End; End;
merci cela marche a merveille!
c'est parfait. j'envie votre facilité a creer du code propre est efficace comme ca!
je debute seulement le delphi, mais ca devrais venir
Une autre solution à base de TSearchRec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm1.Button1Click(Sender: TObject); var SearchRec: TSearchRec; begin if OpenDialog1.Execute then if FindFirst(OpenDialog1.FileName, faAnyFile, SearchRec) = 0 then ShowMessage(FloatToStrF(SearchRec.Size/1048576, ffFixed, 7, 2)+' MB'); FindClose(SearchRec); end;
N'oublies pas le tag
Pour info, SearchRec.Size est du type Integer et ne peut donc pas retourner une taille de fichier > à 4Go... La solution est d'utiliser FindData (voir mon post ci-dessus). Les autres solutions sont devenues obsolètes selon moi...
à+
Envoyé par Fabrice ROUXEL 1
Yep !Nan ! 2,147 et quelques (la limite positive d'un integer, quoi) gig's !type Integer et ne peut donc pas retourner une taille de fichier > à 4Go...
La preuve, la soluce à FabriceRouxel1 me retourne -1410,57 MB sur un fichier de 2,62 gig's.
Mes 2 cts,
--
jp
-Size est de type integer donc la taille max du fichier doit être < 2GO.
-Bestiol dans la faq utilise GetFileSize soit un cardinal avec taille max = 4GO
-La meilleur solution est celle présentée par Sub0 qui propose un Int64 en implementant une "union dans la terminologie du C".
A ce propos la solution de Sub0 a toute sa place dans la FAQ...
Elle y est déjà, mais le code est légèrement différent :Envoyé par Fabrice ROUXEL 1
http://delphi.developpez.com/faq/?pa...#taillefichier
On peut également utiliser un TFileStream et sa propriété Size, mais cela impose d'ouvrir le fichier...
Je rejoint Sub0 dans sa réponse ... par contre il y a une petite erreur dans son code. Par précaution I faudra extraire le FindClose(...) du test IF dans le cas où celui ci ne passe pas.
Cordialement
Octal
Si FindFirst ne renvoie pas 0, doit on appeler FindClose?
Derniere question: le record converter fonctionne t'il sur les systemes little et big endian?
Apparement non. Exemple :Envoyé par Fabrice ROUXEL 1
http://nono40.developpez.com/sources/source0042/
Et j'ai trouvé ceci aussi : http://pascal.developpez.com/faq/?pa...#FichierExisteCertains compilateurs et systèmes d'exploitation attendent l'utilisation de FindClose une fois l'utilisation de FindFirst terminée. C'est notamment le cas sous Windows 9x et suivants. Toutefois, Turbo Pascal ne connaît pas cette procédure, car inutile sous Dos.
Je ne pourrais répondre avec certitude à cette question. Dans tous les cas, je pense qu'il vaut mieux utiliser le code de la Faq avec SHL 32 plutôt que l'enregistrement...Envoyé par Fabrice ROUXEL 1
Autant pour moi. Voilà le code de FindFirst dans l'unité SysUtils
(J'ai coupé la partie Linux)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; const faSpecial = faHidden or faSysFile or faDirectory; {$IFDEF MSWINDOWS} begin F.ExcludeAttr := not Attr and faSpecial; F.FindHandle := FindFirstFile(PChar(Path), F.FindData); if F.FindHandle <> INVALID_HANDLE_VALUE then begin Result := FindMatchingFile(F); if Result <> 0 then FindClose(F); end else Result := GetLastError; end;
On y voit clairement que si FindFirst échoue (result<>0) elle apelle elle meme FindClose.
Donc le code de Sub0 fonctionne parfaitement sans aucun soucis et dans tous les cas.
Juste une question Octal: Il est open source le code de la VCL?
Non le code de la VCL n'est pas Open. Il est fourni avec la version professionnelle et entreprise de Delphi, moi je possède la version Pro et au boulot on a la version Entreprise, et c'est l'une des raison pour laquelle j'ai tronqué le code de la routine que j'ai posté.
Cordialement
Pour le code sous licence je suis au courant.C'était juste un rappel.
Borland conseille de suivre le modèle suivant:
FindFirst searches the directory given by Path for the first entry that
matches the filename given by Path and the attributes given by Attr. The
result is returned in the search record given by SearchRec. The return
value is zero if the function was successful. Otherwise the return value
is a Windows error code. FindFirst is typically used in conjunction with
FindNext and FindClose as follows:
Ce qui a revient à refermer 2 fois si le 1er result échoue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Result := FindFirst(Path, Attr, SearchRec); while Result = 0 do begin ProcessSearchRec(SearchRec); Result := FindNext(SearchRec); end; FindClose(SearchRec);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager