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 !

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à
@LSI j'ai donc testé les 2 commandes sur le même répertoire, (enfin sur le même DD)
ça marche au poil.