Page 1 sur 1

[Resolu] Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 16:46
par Ar-S
Il me semble avoir croisé un code un jour pouvant montrer l'espace restant d'un disque dur ou d'une clé usb mais impossible de mettre la main dessus. Est-ce que ça parle à quelqu'un ?

En résumé je fais un soft de sauvegarde automatisé (le plus basique qui soit) et je souhaiterai qu'avant de lancer la copie, il puisse (tout de même) vérifier que le contenu du répertoire et des sous répertoires à copier soient plus petit que la cible (clé usb par exemple).

Si quelqu'un à ça sous la main.

Pour le poids du dossier je suppose qu'ExamineDirectory et ses copains sont indispensable mais pour la taille restante d'un volume comme un DDur, il doit bien y avoir un API qui traine ?

D'avance merci

Re: Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 17:16
par mekkisoft
Essayes ce code..

Code : Tout sélectionner

Structure int64 
  Long1.l 
  Long2.l 
EndStructure 

drive$ = "c:\" 

SetErrorMode_(#SEM_FAILCRITICALERRORS) 
                                        
If GetDiskFreeSpaceEx_(@drive$, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64) = 0 
  MessageRequester("","Unité non prête!",0) 
  End 
EndIf 

; initailisation de l'erreur msg
SetErrorMode_(0) 

; calcul de la taille en Mb
TotalMB = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12) 
FreeMB = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12) 

Debug "Disk: "+drive$ 
Debug "Taille totale: "+Str(TotalMB)+" Mb" 
Debug "Espace libre:"+Str(FreeMB)+" Mb" 

End

Re: Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 17:26
par mekkisoft
Ou alors (si c'est un répertoire)...

Code : Tout sélectionner

;Pour la taille d'un répertoire, il suffit de calculer la différence
;entre la taille de ton fichier et la taille du répertoire destinataire
;(que tu connaitras grâce à cette procédure ci-dessous), sinon il faudra 
;créer une fonction qui le ferait en jumulant les deux... 

Procedure.l DirectorySize(ID.l, Directory.s) 
  Protected Size.l 
  If ExamineDirectory(ID, Directory, "*.*") 
    Repeat 
      Entry.l = NextDirectoryEntry() 
      If Entry = 1 
        Size + DirectoryEntrySize() 
      ElseIf Entry = 2 
        Name.s = DirectoryEntryName() 
        If Name <> ".." And Name <> "." 
          Size + DirectorySize(ID+1, Directory+Name+"\") 
          UseDirectory(ID) 
        EndIf 
      EndIf 
    Until Entry = 0 
  EndIf 
  ProcedureReturn Size 
EndProcedure 

;test
Debug DirectorySize(0, "C:\purebasic\") 

END

Re: Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 18:31
par Ar-S
la 1ere procédure est parfaite merci, ça fait plaisir de te voir poser du code fonctionnel.
Par contre la seconde ne fonctionne pas

Dans une commande NextDirectoryEntry() il faut indiquer le #directoryentry entre les ()
idem pour DirectoryEntrySize(), etc..
Mais je vais me débrouiller.
Merci ! :D

Re: Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 18:50
par flaith

Re: Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 19:38
par Le Soldat Inconnu
allez, en français, avec mise en forme

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Obtenir l'espace libre ou la taille d'un lecteur, ou afficher l'espace libre ou la taille d'un lecteur (unité et précision personnalisable)


Procedure.q GetDiskFreeSpace(Lecteur.s, Type.l = 0)
  ; lecteur = nom du lecteur
  ; type = choix de la réponse, 0 = espace libre sur le lecteur, 1 = taille du lecteur
  
  Protected EspaceLibre.q,  Taille.q, resultat.q

  GetDiskFreeSpaceEx_(Lecteur, @EspaceLibre, @Taille, 0)
  
  Select Type
    Case 0 : resultat = EspaceLibre
    Case 1 : resultat = Taille
  EndSelect
  
  ProcedureReturn resultat
EndProcedure

Procedure.s DisplayDiskFreeSpace(Taille.q, Unite.l = -1, NbDecimals.l = -1)
  ; Taille = taille du lecteur
  ; Unite = unité de la taille, 0 = Octet, 1 = Ko, 2 = Mo, 3 = Go. Si = -1, Le choix de l'unité et du nombre de décimal sera automatique
  ; NbDecimals = nombre de chiffre après la virgule.
  
  Protected Val.q, Txt.s
  
  If Unite = -1
    NbDecimals = 0 : Unite = 0
    If Taille >= 1000 : Unite = 1 : NbDecimals = 2 : EndIf
    If Taille >= 10000 : Unite = 1 : NbDecimals = 1 : EndIf
    If Taille >= 1000000 : Unite = 2 : NbDecimals = 2 : EndIf
    If Taille >= 10000000 : Unite = 2 : NbDecimals = 1 : EndIf
    If Taille >= 1000000000 : Unite = 3 : NbDecimals = 2 : EndIf
    If Taille >= 10000000000: Unite = 3 : NbDecimals = 1 : EndIf
  EndIf
  Select Unite
    Case 0 : Val = 1 : Txt = " octets"
    Case 1 : Val = 1024 : Txt = " Ko"
    Case 2 : Val = 1024 * 1024 : Txt = " Mo"
    Case 3 : Val = 1024 * 1024 * 1024 : Txt = " Go"
  EndSelect
  ProcedureReturn StrF(Taille / Val, NbDecimals) + Txt
  
EndProcedure


;- Test
Debug GetDiskFreeSpace("c:\program files\", 1)
Debug DisplayDiskFreeSpace(GetDiskFreeSpace("c:\program files\", 1))

Re: [Resolu] Déterminer l'espace restant d'un volume ?

Publié : mar. 03/août/2010 22:09
par Ar-S
Merci à tous.

@flaith => certes mais l'intention est là :P

@LSI j'ai donc testé les 2 commandes sur le même répertoire, (enfin sur le même DD)
ça marche au poil.