Trouver toutes les lettres de lecteur disponibles

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Trouver toutes les lettres de lecteur disponibles

Message par Le Soldat Inconnu »

Une correction, il y avait une erreur dans le code précédent :

Code : Tout sélectionner

Structure DriveInfos
  DriveLetter.s
  DriveType.l
  DriveTypeString.s
  NameOfVolume.s
EndStructure
NewList DriveList.DriveInfos()

Procedure GetDrive(ListDriveType.l)
  Protected Drive.s, DriveLetter.s, DriveType.l, Start.l, LengthDrive.l, DriveTypeString.s
  #REMOVABLE_DRIVE = 1
  #FIXED_DRIVE = 2
  #REMOTE_DRIVE = 4
  #CDROM_DRIVE = 8
  #RAMDISK_DRIVE = 16
  #UNKNOWN_DRIVE = 32
  #ALL_DRIVE = 63
  
  ; On vide la liste
  ClearList(DriveList())
  
  ; On récupère la lettre des différents lecteurs présent sur l'ordinateur
  Drive = Space(255)
  LengthDrive = GetLogicalDriveStrings_(255, @Drive)
  
  For Start = 0 To LengthDrive - 4 Step 4
  
    DriveLetter.s = PeekS(@Drive + Start, 3) ; on récupère une lettre
    
    DriveType.l = GetDriveType_(@DriveLetter) ; on récupère le type du lecteur
    
    Select DriveType ; On donne un nom au type de lecteur
      Case #DRIVE_REMOVABLE : DriveType = #REMOVABLE_DRIVE : DriveTypeString.s = "Disquette"
      Case #DRIVE_FIXED : DriveType = #FIXED_DRIVE : DriveTypeString.s = "Disque dur"
      Case #DRIVE_REMOTE : DriveType = #REMOTE_DRIVE : DriveTypeString.s = "Lecteur réseau"
      Case #DRIVE_CDROM : DriveType = #CDROM_DRIVE : DriveTypeString.s = "CD-ROM"
      Case #DRIVE_RAMDISK : DriveType = #RAMDISK_DRIVE : DriveTypeString.s = "RamDisk"
      Case #DRIVE_UNKNOWN : DriveType = #UNKNOWN_DRIVE : DriveTypeString.s = ""
    EndSelect
    
    If DriveType & ListDriveType ; on regarde si le type du lecteur correspond à ceux demandés
      AddElement(DriveList())
      DriveList()\DriveLetter = RemoveString(DriveLetter, "\")
      DriveList()\DriveType = DriveType
      DriveList()\DriveTypeString = DriveTypeString
      
      If DriveLetter <> "A:\" And DriveLetter <> "B:\"
        DriveList()\NameOfVolume = Space(255)
        GetVolumeInformation_(@DriveLetter, @DriveList()\NameOfVolume, 255, 0, 0, 0, 0, 0)
        DriveList()\NameOfVolume = Trim(DriveList()\NameOfVolume)
      Else
        DriveList()\NameOfVolume = ""
      EndIf
      
    EndIf
  
  Next
EndProcedure




;- Debut du test

GetDrive(#REMOVABLE_DRIVE | #CDROM_DRIVE | #FIXED_DRIVE)

ResetList(DriveList())
While NextElement(DriveList())
  Debug DriveList()\DriveLetter + "   " + DriveList()\DriveTypeString + "   " + DriveList()\NameOfVolume
Wend
Vous pouvez me dire si le code marche bien sur vos PC, merci :wink:
Dernière modification par Le Soldat Inconnu le dim. 04/avr./2004 18:19, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai pas mal de lecteur et ça marche super! :D
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

m'sieur l'admin, tu sais que tu peux modifier ton post via le bouton éditer...
ça évite de reposter... m'enfin, moi je disait ça comme ça.... :P

pat
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui, mais personne n'est au courant car ça ne marque pas de nouveau message et comme je voulais avoir des tests sur d'autres PC ... donc ce n'est pas modifier mais supprimer le vieux post qu'il faut faire :mrgreen:
il faut trancher dans le message à la machette :roll:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

ça fonctionne
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Moi aussi, a part que ma clé USB est prise pour une disquette :roll:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui, pour un disque amovible, j'ai mis disquette en définition, pour windows, c'est la même chose, disquette, clé usb, lecteur zip etc...
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voici une autre façon de faire Mais Heis, ta clé USB sera prise pour une disquette (tu sais peut-être comment récupérer ce type d'infos sur la clé USB ?)

Dans le code qui suit, je ne récupère pas le nom du volume lorsque c'est une disquette ça évite le test sur le lecteur.

Code : Tout sélectionner

Structure DrivesInfos
  Nom.s          ;  nom du drive ex : A:\ ou D:\
  NomAfficher.s  ;  Par exemle Disquette 3 (A:)  ou  Système (C:) ou (E:)
  Type.l         ;  le type  CD etc.
EndStructure

NewList Drives.DrivesInfos()             ; liste chainée pour stocker tous les drives 

Procedure GetAllDrives()
   Lettre = 65                       ; Ascii de 'A'
   MaskDrive = GetLogicalDrives_()   ; récupère le Mask des drives
   Mask      = 1                     ; = 0000 0000 0000 0000 0000 0000 0000 0001  <-- bit B0
   lpFileSystemNameBuffer.s = Space(256)

   For i = 1 To 32                   ; 32 bits à tester
     If MaskDrive & Mask             ; teste le bit B0 etc jusqu'à B31
        AddElement(Drives())
        Drives()\Nom = Chr(Lettre)+":\"
        Drives()\NomAfficher = Space(256)
        Drives()\NomAfficher = ""

;       Récupère le type de Drive
        Drives()\Type = GetDriveType_(Drives()\Nom)
        
        If Drives()\Type <> #DRIVE_REMOVABLE ; c'est un lecteur de disquette, on ne récupère pas
                                             ; le nom de volume pour éviter les tests sur le lecteur
           GetVolumeInformation_(Drives()\Nom,Drives()\NomAfficher,256,0,0,0,lpFileSystemNameBuffer,256)
        EndIf

        If Len(Drives()\NomAfficher)
           Drives()\NomAfficher = UCase(Left(Drives()\NomAfficher, 1)) + LCase(Mid(Drives()\NomAfficher, 2, Len(Drives()\NomAfficher)-1)) 
           Drives()\NomAfficher = Drives()\NomAfficher + " ("+ Chr(Lettre) + ":)"
        Else
           If Drives()\Type = #DRIVE_REMOVABLE   ; lecteur de disquette
              Drives()\NomAfficher = "Disquette 3" + Chr(189) + " ("+ Chr(Lettre) + ":)"
           Else
              Drives()\NomAfficher = "("+ Chr(Lettre) + ":)"
           EndIf
        EndIf 
     EndIf
     Mask << 1
     Lettre + 1
   Next i
EndProcedure 

GetAllDrives()

; Affiche les drives :

ForEach Drives()
  Debug "Lecteur : " + Drives()\nom
  Debug Drives()\NomAfficher
  Debug ""
Next

Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

On pourrait améliorer un peu le code que je viens de poster en commençant la boucle for i à 65 jusqu'à 97 et supprimer la variable Lettre et donc remplacer les chr(Lettre) par des Chr(i).

Voilà le code modifié

Code : Tout sélectionner

Structure DrivesInfos
  Nom.s          ;  nom du drive ex : A:\ ou D:\
  NomAfficher.s  ;  Par exemle Disquette 3 (A:)  ou  Système (C:) ou (E:)
  Type.l         ;  le type  CD etc.
EndStructure

NewList Drives.DrivesInfos()             ; liste chainée pour stocker tous les drives 

Procedure GetAllDrives()
   MaskDrive = GetLogicalDrives_()   ; récupère le Mask des drives
   Mask      = 1                     ; = 0000 0000 0000 0000 0000 0000 0000 0001  <-- bit B0
   lpFileSystemNameBuffer.s = Space(256)

   For i = 65 To 97                   ; 32 bits à tester
     If MaskDrive & Mask             ; teste le bit B0 etc jusqu'à B31
        AddElement(Drives())
        Drives()\Nom = Chr(i)+":\"
        Drives()\NomAfficher = Space(256)
        Drives()\NomAfficher = ""

;       Récupère le type de Drive
        Drives()\Type = GetDriveType_(Drives()\Nom)
        
        If Drives()\Type <> #DRIVE_REMOVABLE ; c'est un lecteur de disquette, on ne récupère pas
                                             ; le nom de volume pour éviter les tests sur le lecteur
           GetVolumeInformation_(Drives()\Nom,Drives()\NomAfficher,256,0,0,0,lpFileSystemNameBuffer,256)
        EndIf

        If Len(Drives()\NomAfficher)
           Drives()\NomAfficher = UCase(Left(Drives()\NomAfficher, 1)) + LCase(Mid(Drives()\NomAfficher, 2, Len(Drives()\NomAfficher)-1)) 
           Drives()\NomAfficher = Drives()\NomAfficher + " ("+ Chr(i) + ":)"
        Else
           If Drives()\Type = #DRIVE_REMOVABLE   ; lecteur de disquette
              Drives()\NomAfficher = "Disquette 3" + Chr(189) + " ("+ Chr(i) + ":)"
           Else
              Drives()\NomAfficher = "("+ Chr(i) + ":)"
           EndIf
        EndIf 
     EndIf
     Mask << 1
   Next i
EndProcedure 

GetAllDrives()

; Affiche les drives :

ForEach Drives()
  Debug "Lecteur : " + Drives()\nom
  Debug Drives()\NomAfficher
  Debug ""
Next

Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Ma pauvre clé USB aimée de personne :cry:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Heis Spiter a écrit :Ma pauvre clé USB aimée de personne :cry:
Ta clé USB apparait dans le poste de travail ?
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Ben vouais, en tant que disque amovible (G:)
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ok,

Merci
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

pour windows, c'est une disquette, chez moi, ça marche, essaye avec mon bi-exploreur
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre