Différence floppy/lecteur USB

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 6 juin 2006 à 13:32
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 - 9 juin 2006 à 13:29
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

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
7 juin 2006 à 14:34
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.
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
7 juin 2006 à 16:06
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...
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 01:28
@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 ^^)
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
8 juin 2006 à 10:23
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;
                }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 13:07
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.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 13:14
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)
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
8 juin 2006 à 13:52
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
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 18:36
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.....
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 18:45
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....)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 juin 2006 à 19:24
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...)
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
9 juin 2006 à 13:29
>> 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 ^^
0
Rejoignez-nous