OVH Cloud OVH Cloud

récupérer le poids d'un répertoire

10 réponses
Avatar
Titouille
Bonjour à tous !!

Vala... Je cherche à récupérer la capacité d'un disque ainsi que le
poids d'un répertoire précis.

Alors j'ai cherché un moment et j'ai trouvé win32api.GetDiskFreeSpaceEx
pour récupérer la capacité d'un disque.

Par contre, pour le poids d'un répertoire, je n'ai rien trouvé de
concluant... J'ai essayé avec GetFileAttributes, mais il me retourne
juste un entier (16). Est-ce que quelqu'un aurai une idée sur la question ?


D'avance merci à vos suggestions.

a++

Thierry

10 réponses

Avatar
kaerbuhez
Bonjour à tous !!

Vala... Je cherche à récupérer la capacité d'un disque ainsi que le
poids d'un répertoire précis.

Alors j'ai cherché un moment et j'ai trouvé win32api.GetDiskFreeSpaceEx
pour récupérer la capacité d'un disque.

Par contre, pour le poids d'un répertoire, je n'ai rien trouvé de
concluant... J'ai essayé avec GetFileAttributes, mais il me retourne
juste un entier (16). Est-ce que quelqu'un aurai une idée sur la question ?


D'avance merci à vos suggestions.

a++

Thierry
A mon avis, ça n'existe pas. Si je clique droit sur un répertoire dans

Windows Explorer et que je clique sur propriétés, le "poids" est calculé
: choisis un gros répertoire - documents and settings par exemple et tu
verras. Je pense que u dois faire la même chose. Attention, ceci n'est
qu'un avis, je ne suis pas un grand connaisseur de win32 mais c'est
comme ça que je ferais.

Avatar
Do Re Mi chel La Si Do
Bonjour aussi !

Pour avoir quelques informations sur les disques logiques d'un PC, tu peux
essayer le script ci-dessous.

Attention WMI doit être autorisé. Si les droits sont suffisants, on peut
même obtenir les informations pour une autre ordinateur du réseau ; il
suffit de remplacer
strComputer = "."
par
strComputer = "NOMPOSTEDISTANT"

@-salutations

Michel Claveau






# informations reduites sur les disques logiques d'un systeme
# par Michel Claveau

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"rootcimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
for objItem in colItems:
print "Caption: ", objItem.Caption
print "Compressed: ", objItem.Compressed
print "Description: ", objItem.Description
print "Device ID: ", objItem.DeviceID
print "Drive Type: ", objItem.DriveType
print "File System: ", objItem.FileSystem
print "Free Space: ", objItem.FreeSpace
print "Media Type: ", objItem.MediaType
print "Name: ", objItem.Name
print "Size: ", objItem.Size
print "Supports Disk Quotas: ", objItem.SupportsDiskQuotas
print "System Name: ", objItem.SystemName
print "Volume Name: ", objItem.VolumeName
print "Volume Serial Number: ", objItem.VolumeSerialNumber
print
Avatar
Do Re Mi chel La Si Do
Re !

Pour connaître la taille d'un répertoire, le mieux est d'utiliser os.walk,
et d'additionner les informations de taille des fichiers.

Mais, il va falloir déterminer si tu veux travailler avec la taille exacte
des fichiers, la taille sur le disque, et, éventuellement, la taille
compressée.
De même, voudrais-tu la taille du seule répertoire, ou celle avec les
sous-répertoires (ou encore, avoir les deux informations).

@-salutations

Michel Claveau
Avatar
Do Re Mi chel La Si Do
Re-re

Autre démarche : wrapper les commandes internes de Windows ; en
l'occurrence, DIR
Ci-dessous, un exemple, avec subprocess.
Evidemment, il faut indiquer le répertoire voulu.

A noter que, d'après des tests antérieurs, cette méthode est beaucoup plus
rapide que os.walk.

@-salutations

Michel Claveau




# -*- coding: cp1252 -*-

# TaiRep.py par Michel Claveau

import subprocess
p1=subprocess.Popen(r'cmd /cdir D:devpython*.* /-C /S /W',
stdout=subprocess.PIPE)
stmp=p1.stdout.read().split('rn')[-3:]

sret=stmp[0].split()
print "Nb fichiers :",sret[0]
print "Taille totale :",sret[2]

sret=stmp[1].split()
print "Nb répertoire :",sret[0]
print "Taille libre :",sret[2]
Avatar
Do Re Mi chel La Si Do
Re-re-re

Pour ceussent qui seraient en Python-2.3, et n'auraient pas installé
subprocess, voici la même chose, en version popen4 :

@-salutations

Michel Claveau




import os
stmp=os.popen4(r'cmd /cdir D:devpython*.* /-C /S /W')[1].readlines()[-2:]

sret=stmp[0].split()
print "Nb fichiers :",sret[0]
print "Taille totale :",sret[2]

sret=stmp[1].split()
print "Nb répertoire :",sret[0]
print "Taille libre :",sret[2]
Avatar
Titouille
Ok, merci beaucoup pour toutes ces infos.

Est-il possible d'utiliser cette même méthode "popen4" en récupérant la
taille utilisée sur le disque ?
Car en fait le but est de faire une comparaison entre la capacité d'un
lecteur amovible et la taille d'un répertoire, pour savoir si son
contenu est copiable sur le lecteur.
Donc la taille utilisée sur le disque serait plus intéressante à récupérer.

M'enfin, déjà merci pour ces divers exemples.

Je vais creuser du côté de os.walk pour voir ce que je peux trouver.

A++


Thierry


Re-re-re

Pour ceussent qui seraient en Python-2.3, et n'auraient pas installé
subprocess, voici la même chose, en version popen4 :

@-salutations

Michel Claveau




import os
stmp=os.popen4(r'cmd /cdir D:devpython*.* /-C /S /W')[1].readlines()[-2:]

sret=stmp[0].split()
print "Nb fichiers :",sret[0]
print "Taille totale :",sret[2]

sret=stmp[1].split()
print "Nb répertoire :",sret[0]
print "Taille libre :",sret[2]






Avatar
Titouille

Bonjour aussi !

Pour avoir quelques informations sur les disques logiques d'un PC, tu peux
essayer le script ci-dessous.

Attention WMI doit être autorisé. Si les droits sont suffisants, on peut
même obtenir les informations pour une autre ordinateur du réseau ; il
suffit de remplacer
strComputer = "."
par
strComputer = "NOMPOSTEDISTANT"


Comme je suis plutôt inculte en python et pas très au courant avec
windows, je vais peut-être poser une question conne... C'est quoi, WMI
?? Est-ce qu'il faut être administrateur ? est-ce qu'en général, c'est
autorisé, ou plutôt restreint ?



@-salutations

Michel Claveau






# informations reduites sur les disques logiques d'un systeme
# par Michel Claveau

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"rootcimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
for objItem in colItems:
print "Caption: ", objItem.Caption
print "Compressed: ", objItem.Compressed
print "Description: ", objItem.Description
print "Device ID: ", objItem.DeviceID
print "Drive Type: ", objItem.DriveType
print "File System: ", objItem.FileSystem
print "Free Space: ", objItem.FreeSpace
print "Media Type: ", objItem.MediaType
print "Name: ", objItem.Name
print "Size: ", objItem.Size
print "Supports Disk Quotas: ", objItem.SupportsDiskQuotas
print "System Name: ", objItem.SystemName
print "Volume Name: ", objItem.VolumeName
print "Volume Serial Number: ", objItem.VolumeSerialNumber
print




Avatar
Do Re Mi chel La Si Do
Bonsoir !


Le premier script (par WMI) donne, notamment, la taille totale de chaque
disque.
Le dernier script (message précédent) donne, notamment, la taille libre.

A partir de ces deux informations, il est possible de calculer le taille
occupée. Ce calcul se fait par utilisation d'un algorithme mathématique,
appelé "soustraction". Et, comble de bonheur pour toi, Python est capable
d'utiliser la soustraction. Si ! Si !

Évidemment, cela nécessite de saisir le code nécessaire. Python n'est pas
encore arrivé au niveau de facilité d'un langage comme EASY. Mais, enfin, je
ne pense pas que ce soit insurmontable.


@-salutations

Michel Claveau




PS : je ne suis ni méchant, ni cyclothymique ; c'est seulement un peu
d'empathie avec "Complot", qui passe, en ce moment, à la TV.
Avatar
Do Re Mi chel La Si Do
Bonsoir !


WMI, c'est Windows Management Instrumentation. C'est l'implantation, dans
Windows, de la norme WBEM de la DMTF (Distributed Management Task Force ;
http://www.dmtf.org/standards/wbem/). Cette norme permet à l'utilisateur
d'obtenir beaucoup d'informations sur leur système ; et, dans une certaine
mesure, permet aussi de modifier des paramètres.

En théorie, elle devrait être implémentée dans tous les O.S. ;
malheureusement, quelques-uns ne respectent pas les normes.

Bref, pour windows, WMI peut être utilisé de trois façons :
- par un API direct ;
- par COM ;
- en invite de commande, grâce à WMIC.exe (pour l'aide, taper WMIC /?)

Pour les droits, c'est assez compliqué, car ils peuvent varier selon les
éléments. Par défaut, ils sont activés, au moins en lecture, pour tout le
monde.
On peut les ajuster, en passant par "Services & Applications" de la console
de gestion du poste de travail (clic-droit + gérer).

Le plus simple, c'est d'essayer le script.


@-salutations

Michel Claveau
Avatar
Titouille
Ok, merci pour toutes ces infos Michel (WMI également), tu donne de très
bonnes explications ;)


A++


Thierry

Bonsoir !


Le premier script (par WMI) donne, notamment, la taille totale de chaque
disque.
Le dernier script (message précédent) donne, notamment, la taille libre.

A partir de ces deux informations, il est possible de calculer le taille
occupée. Ce calcul se fait par utilisation d'un algorithme mathématique,
appelé "soustraction". Et, comble de bonheur pour toi, Python est capable
d'utiliser la soustraction. Si ! Si !

Évidemment, cela nécessite de saisir le code nécessaire. Python n'est pas
encore arrivé au niveau de facilité d'un langage comme EASY. Mais, enfin, je
ne pense pas que ce soit insurmontable.


@-salutations

Michel Claveau




PS : je ne suis ni méchant, ni cyclothymique ; c'est seulement un peu
d'empathie avec "Complot", qui passe, en ce moment, à la TV.