Différence floppy/lecteur USB

Signaler
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
-
salut a tous.
en rapport avec l'appli postée il y a qqs jours (le client FTP), il y a a lheure actuelle 2 bugs que je n'arrive pas a résoudre. le principal étant que lorsque je veux connaitre le type d'un périphérique par DriveInfo.DriveType, un lecteur USB et un floppy sont tous deux détéctés comme DriveType.Removable....bref, impossible de différencier (et donc faire afficher des icones différentes) selon le type de périph.....y'a t il un moyen de savoir si le lecteur est USB (appareil photo numérique, clé usb, ou que sais je encore) ou un floppy? jusque la jai vraiment pas trouvé :(

PS : le deuxieme bug est que lorsque je veux renommer un fichier, jappelle BeginEdit sur l'item de ma listview, et dans l'event AfterEdit je rejette la modif si un fichier au meme nom existe déjà...et si la modif est rejetée, la souris se met en mode cadre de séléction (comme si le bouton gauche etait enfoncé et que je voulais séléctionner un groupe d'items)...pareil, si qqun a une idée de pourquoi ce phénomène se présente, et comment le résoudre je suis preneur ;)

Merci d'avance

11 réponses

Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Salut,


Effectivement, DriveType répond "Removable" pour les deux.

Une solution pas super propre pourrait être de regarder la propriété
TotalSize. Entre un floppy et un lecteur USB, la différence est notable
(1.44Mo contre plusieurs dizaines ou centaines de Mo)







Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Concernant la différence USB / Floppy :

J'ai déjà été confronté à ce genre de problème, mais dans mon cas j'utilisais un ManagementObjectSearcher pour lister les "drives", ce qui me renvoyait une liste de ManagementObject... Lesquels possédaient une propriété "DriveType" (du même type que celle que possède DriveInfo), mais aussi une propriété 'MediaType" (ayant des valeurs du genre : FloppyDisk, OtherRemovableMedia, etc).

D'après ce que j'ai vu, DriveInfo ne possède pas la propriété MediaType... mais il y a peut être un moyen d'y accéder autrement... En espérant que ça aide...
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
@nikoui : comment puis je construire un objet du type que tu décris et lexploiter? je peux utiliser cet objet pour linstancier avec la lettre d'un lecteur directement? (je construirais ds ce cas ce type dobjet a chaque fois que jai un lecteur de type "Removable").

@econs : si aucune disquette n'est présente dans mon lecteur, est ce que je ne vais pas trouver 0 pour TotalSize? et si je tombe un jour sur un périphérique de totalsize à 0, je le prendrais pour un lecteur disquette...(lecteur usb non formaté, ou au type de formatage non reconnu, ca donnerais pas 0 aussi par hasard?).
bref, ca me semble pas super fiable (mais cest une solution à envisager ^^)
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
leprov, voila comment je m'en sert :

            // On récupère la liste des lecteurs connus
            ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * From Win32_LogicalDisk ");
            ManagementObjectCollection driveCollection = query.Get();
            foreach (ManagementObject driveObject in driveCollection)
            {              
                // Nom de lecteur
                string driveFullName = driveObject["Name"].ToString();
                // Type de lecteur
                int driveypeId = int.Parse(driveObject["DriveType"].ToString());
                // Type de média
                int mediaTypeId = int.Parse(driveObject["MediaType"].ToString());
             }

avec :

                switch (driveypeId)
                {
                    case 1:
                       //NoRootDirectory
                        break;
                    case 2:
                        //RemovableDisk
                        break;
                    case 3:
                        //LocalDisk
                        break;
                    case 4:
                        //NetworkDrive
                        break;
                    case 5:
                        //CompactDisc
                        break;
                    case 6:
                        //RAMDisk
                        break;
                }

et :

                switch (mediaTypeId)
                {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                    case 9:
                    case 10:
                    case 13:
                    case 14:
                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20:
                    case 21:
                    case 22:
                        //FloppyDisk, chaque valeur ci dessus pour une taille différente de disquette
                        break;
                    case 11:
                        //OtherRemovableMedia
                        break;
                    case 12:
                        //FixedHardDisk
                        break;
                }
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
ok je crois juste que je vais changer mon code de détéction des disques pour utiliser ca....
par contre la requête sort d'où? ca tape dans une BD? définie ou et comment? où est ce que je pourrais consulter la liste des requêtes possibles avec cet objet?

en tous cas merci bcp ;)
je teste ca des ce soir et je valide la réponse si ca marche.
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
sinon je pense a autre chose pour pas forcément reprendre tout mon code, je peux pas faire un truc du genre

if (MyDrive.DriveType == DriveType.Removable)
{
   ManagementObjectSearcher query = 
      new ManagementObjectSearcher(
         "select MediaTypeId from Win32_LogicalDisk where Name == " + MyDrive.Name);
   int mediaTypeId = int.Parse(driveObject["MediaType"].ToString());

   if (mediaTypeId == 11)
   {
      //lecteur usb
   }
   else if (mediaTypeId <= 22 && mediaTypeId != 12) 
   {
      //floppy
   }

dans ce cas est ce que ma requête est juste? si non que dois-je écrire? ca me semble mieux de n'utiliser cet objet que dans le cas ou jai un DriveType.Removable. ca mevite de changer tout monde code et jai juste un traitement a ajouter pour faire la différence (dans le cas ou je fais tout comme toi je dois reprendre toute ma portion de code......un peu casse pieds lol)
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Tu trouveras plus d'info ici.

Et concernant ta requête, a vrai dire je ne sais pas si ca marchera... (mais en testant tu sera vite fixé).
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_logicaldisk.asp
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
y a t il une manip spécifique a faire pour utiliser les objets de management? selon msdn, il suffit d'utiliser System.Management. Hors, cet espace de nom n'a pas l'air dexister chez moi.....
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
quel idiot jai répondu a ma question tout seul...il manquait juste la référence à la dll ....
désolé pour cette question un poil stupide (vu l'évidence de la réponse....)
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
Verdict : ma requête de fonctionnait pas...
sinon par ce biais j'arrive effectivement à faire la différence entre usb et lecteur disquette. par contre a chaque appel ca fait grésiller le lecteur (ce qui est légèrement stressant sachant que l'appel est potentiellement récurrent...)
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
>> a chaque appel ca fait grésiller le lecteur

Oui, je rencontre le même problème (scan de tous les lecteurs, avec le petit temps d'attente sur les lecteurs de disquette...). Je n'ai pas encore trouvé de solution pour éviter ça, si tu trouves je suis preneur ^^