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 ! :D
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