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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
Dernière modification par Ar-S le mar. 03/août/2010 21:58, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
mekkisoft
Messages : 22
Inscription : mar. 07/juil./2009 16:45
Contact :

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

Message 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
Mekkisoft Editeur de logiciels et sites web
mekkisoft
Messages : 22
Inscription : mar. 07/juil./2009 16:45
Contact :

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

Message 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
Mekkisoft Editeur de logiciels et sites web
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message par flaith »

Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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))
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)]
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre