| Place libre sur un disque | |
|
|
|
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Jeu 8 Oct 2015 - 22:50 | |
| Merci cosmos pour le retour. | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Place libre sur un disque Jeu 8 Oct 2015 - 23:26 | |
| Ça marche ! La bonne vieille programmation BATCH ! Ne dit-on pas que « c’est dans les vieilles marmites qu’on fait les meilleures soupes » ? | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Jeu 8 Oct 2015 - 23:30 | |
| C'est à croire ! j'ai voulu utiliser des trucs plus sophistiqués, et puis c'est le bon vieux batch qui fait l'affaire. Bon, j'ôte la marmite du feu, et puis... Bonne nuit papydall et les autres qui veillent encore... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Place libre sur un disque Jeu 8 Oct 2015 - 23:54 | |
| Bonne soupe! Heu ... C'est-à-dire ... Bonne nuit! Quant à moi, c'est trop tôt pour boire ma tasse de lait bien chaud avant d'aller au lit | |
|
| |
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 13:01 | |
| Bonjour à tous Avec disk_exist, l'erreur n'est pas due à une prise USB mais si vous avez une imprimante connectée avec un lecteur de carte XD MMC SD... Etc... Je crois que Jack n,à pas prévu ce cas quand il a développé cette commande. À+ | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 13:09 | |
| Bonjour bignono, C'est mon cas, et bien sûr tu dois avoir raison, en tout cas c'est inutilisable en l'état pour ce que je voulais faire, s'il y a des cas d'erreur qui sont bloquants. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 13:48 | |
| Et la fonction GetVolumeList de KGF.dll (section "gestion de fichiers") ne fait pas l'affaire ? Ca me semblait assez complet... | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 15:11 | |
| Certes Klaus, cette fonction est très complète et largement suffisante, mais je cherchais à faire quelque chose de plus universel et plus transportable, sans ressources externes. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 15:19 | |
| Alors, je ne peux pas vraiment aider. J'aurais bien collé ici le code Delphi de cette fonction, mais elle est complexe et fait appel à plusieurs API et des traitements binaires d'informations retournées par ces API. Donc, non utilisable en 100 % Panoramic. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 16:33 | |
| Merci Klaus, mais je crois le problème résolu avec le dernier code que j'ai posté: je récupère la liste des volumes utiles (c'était ça le problème principal) avec un script dans un .bat, ça marche. Pour les caractéristiques de chaque volume c'est plus facile, avec les fonctions Panoramic Disk_Kilo_Size et Disk_Kilo_Free suggérées par bignono. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 16:45 | |
| Très bien. Mais, juste pour approfondir la chose; dans Kernel32.dll, tu as la fonctioin GetLogicalDrives. Elle ne prend pas de paramètres et retourne une valeur de type integer. Donc, facile à appeler depuis Panoramic. Et la valeur retournée est un masque binaire où seuls les 26 premiers bits sont définis: bits 0 à 25. Si un bit est "1", le drive correspondant est présent et disponible. Si le bit est "0", le drive n'est pas présent. La numérotation se lit comme suit, avec des valeurs décimales pour représenter les bits: 1 = A: (bit 0) 2 = B: (bit 1) 4 = C: (bit 2) 8 = D: (bit 3) ... 2^^25 = Z: (bit 4) Tu peux l'utiliser comme suit: - Code:
-
dim drives%, i%, mask% dll_on "Kernel32.dll" memo 1 : full_space 1 drives% = dll_call0("GetLogicalDrives") item_add 1,"dirves% = "+hex$(drives%)+"(hex)" item_add 1,"" mask% = 1 for i%=1 to 25 if bin_and(drives%,mask%)>0 item_add 1,chr$(64+i%)+": présent" else item_add 1,chr$(64+i%)+":" end_if mask% = mask% * 2 next i% end | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 17:06 | |
| Tu peux aller plus loin avec un second API GetDriveTypeA: - Code:
-
dim drives%, i%, mask%, typ$, type%, drv$, ad1%, ad2% dll_on "Kernel32.dll" memo 1 : full_space 1 drives% = dll_call0("GetLogicalDrives") item_add 1,"dirves% = "+hex$(drives%)+"(hex)" item_add 1,"" mask% = 1
for i%=1 to 25 if bin_and(drives%,mask%)>0 drv$ = chr$(64+i%)+":" ad1% = adr(drv$) poke adr(ad2%),peek(ad1%) poke adr(ad2%+1),peek(ad1%+1) poke adr(ad2%+2),peek(ad1%+2) poke adr(ad2%+3),peek(ad1%+3) type% = dll_call1("GetDriveTypeA",ad2%) select type% case 0 typ$ = "inconnu" case 1 typ$ = "pas de volume chargé" case 2 typ$ = "amovible" case 3 typ$ = "fixe/flash" case 4 typ$ = "réseau" case 5 typ$ = "CD-Rom" case 6 typ$ = "mémoire" end_select item_add 1,chr$(64+i%)+": présent "+typ$ else item_add 1,chr$(64+i%)+":" end_if mask% = mask% * 2 next i% end
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 17:31 | |
| Et, avec un autre API GetDiskFreeSpaceA, tu obtiens ceci: - Code:
-
dim drives%, i%, mask%, typ$, type%, drv$, ad1%, ad2%, res% dim SectorsPerCluster%,BytesPerSector%,NumberOfFreeClusters%,TotalNumberOfClusters% dll_on "Kernel32.dll" memo 1 : full_space 1 drives% = dll_call0("GetLogicalDrives") item_add 1,"dirves% = "+hex$(drives%)+"(hex)" item_add 1,"" mask% = 1
for i%=1 to 25 if bin_and(drives%,mask%)>0 drv$ = chr$(64+i%)+":" ad1% = adr(drv$) poke adr(ad2%),peek(ad1%) poke adr(ad2%+1),peek(ad1%+1) poke adr(ad2%+2),peek(ad1%+2) poke adr(ad2%+3),peek(ad1%+3) type% = dll_call1("GetDriveTypeA",ad2%) select type% case 0 typ$ = "inconnu" case 1 typ$ = "pas de volume chargé" case 2 typ$ = "amovible" case 3 typ$ = "fixe/flash" case 4 typ$ = "réseau" case 5 typ$ = "CD-Rom" case 6 typ$ = "mémoire" end_select if type%>1 res% = dll_call5("GetDiskFreeSpaceA",ad2%,adr(SectorsPerCluster%),adr(BytesPerSector%),adr(NumberOfFreeClusters%),adr(TotalNumberOfClusters%)) if res%=0 typ$ = typ$ + " "+"non opérationnel" else typ$ = typ$ + " "+str$(NumberOfFreeClusters%)+" clusters libres" end_if end_if item_add 1,chr$(64+i%)+": présent "+typ$ else item_add 1,chr$(64+i%)+":" end_if mask% = mask% * 2 next i% end
Tu as ainsi le nombre de clusters libres (affichés), ainsi que le nombre de secteurs par cluster et le nombre de bytes par cluster. Je te laisse faire les multiplications et divisions pour avoir le nombre de kilo-octets... Tu as ainsi une solution complète, 100 % Panoramic, juste avec Kernel32.dll qui est disponible partout. Si tu veux obtenir le nom logique du disque ou éventuellement le label d'un disque amovible, c'est plus complexe, car Panoramic ne sait pas gérer le retour d'une chaîne de caractères à partir d'une DLL. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 18:01 | |
| Merci pour tout ceci klaus, mais si tu regardes mon code d'hier à 11h18 j'appelais bien Kernel.dll fonction GetLogicalDrive et je l'exploitais comme tu as dit, ça me convenait très bien, mais ça ne marchait pas pour certains, alors j'ai cherché autre chose. Il y a aussi des appels à fsutil qui peuvent résoudre le problème, mais il faut être en mode administrateur, sinon ça bloque. (peut-être aussi pour kernel32.dll ?). En tout cas je vais laisser en l'état, c'était juste pour un petit utilitaire à consulter vite fait, sans prétentions. Et pour les tailles totale et occupée, les fonctions Panoramic conviennent bien. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 19:20 | |
| Oui, tu utilises bien GetLogicalDrives pour avoir la liste des drives. Mais après cela, tu fermes la DLL et tu demandes le reste des informations à Panoramic. Or, même si certains drives existent, les fonctions Panoramic ne sont pas forcément faites pour travailler dessus. Regarde mon dernier code: tout est fait avec des API et en traitant les erreurs qui arrivent... | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Place libre sur un disque Ven 9 Oct 2015 - 19:34 | |
| Oui, mais si tu regardes le code d'hier à 21h05, les disques qui ne sont pas accessibles sont automatiquement éliminés par le traitement qui est fait ensuite (utilisation de la fonction VOL de ms-dos). On élimine ainsi les "Le périphérique n'est pas prêt" et les "Accès refusé", on ne garde que ceux qui sont reconnus par 'VOL'. | |
|
| |
Contenu sponsorisé
| Sujet: Re: Place libre sur un disque | |
| |
|
| |
| Place libre sur un disque | |
|