Page 1 sur 1
Conversion d'octets en MegaOctets
Publié : dim. 18/déc./2005 19:08
par Jacobus
J'aurai voulu afficher la taille des fichiers en Mo et je n'arrive pas à obtenir un chiffre précis. Il doit quand même y avoir un moyen.
Actuellement je procède ainsi :
Exemple
TailleFichier = FileSize (Fichier$) ; récupère la taille du fichier en octets
TMo.f = ValF ( Str (TailleFichier/1000000)) ; conversion en Mo
TailleEnMo$ = StrF (TMo.f , 2) ; récup de la valeur en float avec 2 décimales
SetGadgetText ( #StringSizeMo , " " + StrF (TMo.f , 2)+ " Mo" ) ; affichage de cette valeur
Malheureusement toute décimale après la virgule (le point) est retournée à zéro.
Donc même si le fichier fait 15654789 octets, le retour sera 15.00 Mo
l'embêtant c'est pour un fichier de 321456 octets, retour : 0.00 Mo ce qui n'est pas faux en soi, mais tout de même
Si vous connaissez une méthode pour avoir les décimales après la virgule, j'aimerai bien la connaître. Merci.
Publié : dim. 18/déc./2005 19:13
par Le Soldat Inconnu
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; DirectorySize : Afficher la taille d'un dossier
; DisplaySize : Afficher une taille en octects, Ko ou Mo. L'unité et la précision sont personnalisables.
Procedure.l DirectorySize(dossier.s)
; Récupère la taille du dossier
Dim DirectoryList.s(1000)
Protected erreur.l, Directory.l, DirectorySize.l
erreur = 0
Directory = 1
DirectorySize = 0
If Right(dossier, 1) <> "\"
dossier = dossier + "\"
EndIf
Repeat
If ExamineDirectory(50, dossier, "*.*")
Repeat
type.l = NextDirectoryEntry()
If type = 1
Nom.s = DirectoryEntryName()
NomFichier.s = dossier + Nom
DirectorySize = DirectorySize + FileSize(NomFichier)
EndIf
If type = 2
Nom = DirectoryEntryName()
If Nom <> "." And Nom <> ".."
Directory = Directory + 1
DirectoryList(Directory) = dossier + Nom + "\"
EndIf
EndIf
Until type = 0
Else
erreur = 1
EndIf
dossier = DirectoryList(Directory)
Directory = Directory - 1
Until Directory = 0
If erreur = 1
ProcedureReturn erreur
Else
ProcedureReturn DirectorySize
EndIf
EndProcedure
Procedure.s DisplaySize(size.l, unit.l, approximation.l, auto.l)
; Affiche une taille en octects, Ko ou Mo
; size = taille du dossier
; unit = unité de la taille, 0 = octets, 1 = Ko, 2 = Mo
; approximation = nombre de chiffre après la virgule
; si auto = 1, choix de l'unité automatique et approximation automatique
Protected val.l
Protected txt.s
If auto
approximation = 0 : unit = 0
If size >= 1000 : unit = 1 : approximation = 2 : EndIf
If size >= 10000 : unit = 1 : approximation = 1 : EndIf
If size >= 1000000 : unit = 2 : approximation = 2 : EndIf
If size >= 10000000 : unit = 2 : approximation = 1 : EndIf
EndIf
Select unit
Case 1 : val = 1024 : txt = " Ko"
Case 2 : val = 1024 * 1024 : txt = " Mo"
Default : val = 1 : txt = " octects"
EndSelect
ProcedureReturn StrF(size / val, approximation) + txt
EndProcedure
Taille = DirectorySize("c:\program files\purebasic\")
Debug "Taille du dossier : " + Str(Taille) + " = " + DisplaySize(Taille, 2, 2, 1)
Publié : dim. 18/déc./2005 19:21
par Anonyme2
1 Ko = 1024 octets
C'est je crois la seule fois ou 1 kilo ne vaut pas mille car c'est un multiple d'une puissance de 2
idem pour les Mo
Un Megaoctet correspond à 2^10 (=1024) Kilooctets, soit 2^20 octets (=1048 576 octets).
Publié : dim. 18/déc./2005 19:22
par Jacobus
Le Soldat Inconnu, le Retour !
Merci de ta réactivité et de ta solution.
Publié : dim. 18/déc./2005 23:29
par Dr. Dri
Denis a écrit :1 Ko = 1024 octets
C'est je crois la seule fois ou 1 kilo ne vaut pas mille car c'est un multiple d'une puissance de 2
idem pour les Mo
Un Megaoctet correspond à 2^10 (=1024) Kilooctets, soit 2^20 octets (=1048 576 octets).
Avant les constructeurs jouaient là dessus
tu achetais un disque dur 10 Go en version *1000
et au moment de le formater tu ne retombais jamais sur 10 Go puisque géré en *1024
J'avais lu un truc qui disais que depuis 1998 le systeme 2^10 (1024) avait été abandonné officiellement mais personne ne semble avoir suivi au niveau software
Dri
Publié : lun. 19/déc./2005 0:17
par Backup
tu achetais un disque dur 10 Go en version *1000
et au moment de le formater tu ne retombais jamais sur 10 Go
c'est bien toujours le cas !!
puisque les données de formatage prennent de la place ... ()

Publié : lun. 19/déc./2005 1:41
par Dr. Dri
Dobro a écrit :tu achetais un disque dur 10 Go en version *1000
et au moment de le formater tu ne retombais jamais sur 10 Go
c'est bien toujours le cas !!
puisque les données de formatage prennent de la place ... ()

En comptant la table d'allocation ^^
Les constructeurs font le calcul 10 * 1000 * 1000 * 1000
(correct depuis 98 )
Les OS font le calcul 10 000 000 000 / (1024 * 1024 * 1024) = 9.3
(en général une table d'allocation FAT32 ne fait 700 Mo lol)
Dri
Publié : lun. 19/déc./2005 8:10
par brossden
Bonjour à tous
Code : Tout sélectionner
Procedure Open_Window_0()
If OpenWindow(0, 216, 0, 600, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Taille fichier")
If CreateGadgetList(WindowID())
StringGadget(1, 120, 70, 220, 20, "")
ButtonGadget(2, 120, 110, 110, 20, "Choix Fichier")
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
Event = WaitWindowEvent() : GadgetID = EventGadgetID()
If Event = #PB_EventGadget
If GadgetID = 2
TailleEnMo$ = StrF (TMo.f , 2)
SetGadgetText(1," "+StrF(FileSize(OpenFileRequester("Selection du fichier","*.*","c:\*.*",1))/(1024*1024),2)+" Mo")
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End
Publié : lun. 19/déc./2005 9:27
par Jacobus
D'ailleurs en appliquant cette méthode (rapide) pour un test on peut illico s'apercevoir des différences relativement importantes et la question qui vient après c'est : Sur quelle valeur sûre peut-on tabler?
Procedure Open_Window_0()
If OpenWindow (0, 216, 0, 600, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Taille fichier" )
If CreateGadgetList ( WindowID ())
StringGadget (1, 120, 70, 220, 20, "" )
StringGadget (3, 120, 100, 220, 20, "" )
StringGadget (4, 120, 130, 220, 20, "" )
ButtonGadget (2, 120, 160, 110, 20, "Choix Fichier" )
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
Event = WaitWindowEvent () : GadgetID = EventGadgetID ()
If Event = #PB_EventGadget
If GadgetID = 2
Resultat$= OpenFileRequester ( "Selection du fichier" , "*.*" , "c:\*.*" ,1)
If Resultat$
SetGadgetText (1, " " + StrF ( FileSize (Resultat$)/(1024*1024),2)+ " Mo" )
SetGadgetText (4, " " + StrF ( FileSize (Resultat$)/1024,2)+ " Ko" )
SetGadgetText (3, " " + Str ( FileSize (Resultat$))+ " octets" )
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
End