Page 1 sur 1

Trouver toutes les lettres de lecteur disponibles

Publié : dim. 04/avr./2004 16:12
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:

Publié : dim. 04/avr./2004 16:48
par nico
J'ai pas mal de lecteur et ça marche super! :D

Publié : dim. 04/avr./2004 16:58
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

Publié : dim. 04/avr./2004 18:15
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:

Publié : dim. 04/avr./2004 19:30
par Oliv
ça fonctionne

Publié : dim. 04/avr./2004 19:32
par Heis Spiter
Moi aussi, a part que ma clé USB est prise pour une disquette :roll:

Publié : dim. 04/avr./2004 21:59
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...

Publié : lun. 26/avr./2004 10:27
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


Publié : lun. 26/avr./2004 13:02
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


Publié : ven. 30/avr./2004 14:10
par Heis Spiter
Ma pauvre clé USB aimée de personne :cry:

Publié : mar. 18/mai/2004 8:37
par Anonyme2
Heis Spiter a écrit :Ma pauvre clé USB aimée de personne :cry:
Ta clé USB apparait dans le poste de travail ?

Publié : mar. 18/mai/2004 11:17
par Heis Spiter
Ben vouais, en tant que disque amovible (G:)

Publié : mar. 18/mai/2004 12:08
par Anonyme2
Ok,

Merci

Publié : mar. 18/mai/2004 12:15
par Le Soldat Inconnu
pour windows, c'est une disquette, chez moi, ça marche, essaye avec mon bi-exploreur