Conversion d'octets en MegaOctets

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Conversion d'octets en MegaOctets

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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).
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Le Soldat Inconnu, le Retour ! :D
Merci de ta réactivité et de ta solution.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ... () :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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

Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre