Page 1 sur 1

Lister tous les lecteurs

Publié : jeu. 31/juil./2008 17:47
par Le Soldat Inconnu
Un petit code pour lister tous les lecteurs, leur type (disquette, disque dur, cd-rom), et leur nom

Code : Tout sélectionner

Procedure GetDrive(Search_Type.l = 63)
  Structure DriveInfos
    Letter.s
    Type.l
    Name.s
  EndStructure
  Global NewList Drive.DriveInfos()
  #GetDrive_REMOVABLE = 1 ; Disque amovible
  #GetDrive_FIXED = 2 ; Disque dur
  #GetDrive_REMOTE = 4 ; Disque réseau
  #GetDrive_CDROM = 8 ; Lecteur cd
  #GetDrive_RAMDISK = 16 ; Lecteur RAM
  #GetDrive_UNKNOWN = 32 ; Inconnu
  Protected DriveString_Length.l, DriveString.l, DriveIndex.l, FileInfo.SHFILEINFO
  
  
  ; On vide la liste
  ClearList(Drive())
  
  CoInitialize_(0) 
  
  ; On récupère la liste des lecteurs
  DriveString_Length = GetLogicalDriveStrings_(0, 0) 
  *DriveString = AllocateMemory(DriveString_Length) 
  GetLogicalDriveStrings_(DriveString_Length, *DriveString) 
  
  For DriveIndex = 0 To DriveString_Length - 4 Step 4
    AddElement(Drive())
    
    Drive()\Letter = PeekS(*DriveString + DriveIndex) ; lettre
    
    Drive()\Type = GetDriveType_(@Drive()\Letter) ; type de lecteur
    
    If Drive()\Type & Search_Type
      
      SHGetFileInfo_(Drive()\Letter, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME) 
      Drive()\Name = PeekS(@FileInfo\szDisplayName)
      
    Else
      DeleteElement(Drive())
    EndIf
  Next
  
  FreeMemory(*DriveString)
  CoUninitialize_() 
  
EndProcedure

Publié : ven. 01/août/2008 8:47
par Kwai chang caine
Merci soldat.
J'ai mis des debug un peu partout et ce qui est bizzare, c'est que j'obtiens des 3 pour les DD et des 5 pour le CD, alors que tes constantes indiquent 2 pour les DD et des 8 pour le CD :roll:

Peut etre que cela n'a rien a voir ??? et que j'ai encore tout faux mais je voulais juste te donner l'info. :wink:

Encore merci 8)

Re: Lister tous les lecteurs

Publié : dim. 11/déc./2011 21:42
par Le Soldat Inconnu
Mise à jour du code, j'avais besoin d'informations supplémentaires

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.6

; Explication du programme :
; Récupérer la lettre et le type (disquette, disque dur, etc...) de tous les lecteurs présents sur l'ordinateur.



Procedure GetDrive(Search_Type.l = -1)
	Structure DriveInfos
		Letter.s
		Type.l
		Name.s
		DisplayName.s
		FileSystem.s
	EndStructure
	Global NewList Drive.DriveInfos()
	
	; Les valeurs retounées dans le type de lecteur
	; #DRIVE_UNKNOWN = 0 ; The Drive Type cannot be determined.
	; #DRIVE_NO_ROOT_DIR = 1 ; The root Path is invalid; for example, there is no volume is mounted at the path.
	; #DRIVE_REMOVABLE = 2 ; The Drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.
	; #DRIVE_FIXED = 3 ; The Drive has fixed media; for example, a hard drive or flash drive.
	; #DRIVE_REMOTE = 4 ; The Drive is a remote (network) Drive.
	; #DRIVE_CDROM= 5 ; The Drive is a CD-ROM Drive.
	; #DRIVE_RAMDISK = 6 ; The drive is a RAM disk.
	
	Protected DriveString_Length.l, DriveString.l, DriveIndex.l, FileInfo.SHFILEINFO
	
	; Vide la liste
	ClearList(Drive())
	
	; Récupère la liste des lecteurs
	DriveString_Length = GetLogicalDriveStrings_(0, 0)
	*DriveString = AllocateMemory(DriveString_Length)
	GetLogicalDriveStrings_(DriveString_Length, *DriveString)
	
	For DriveIndex = 0 To DriveString_Length - 4 Step 4
		AddElement(Drive())
		
		Drive()\Letter = PeekS(*DriveString + DriveIndex) ; Lettre
		
		Drive()\Type = GetDriveType_(@Drive()\Letter) ; Type de lecteur
		
		
		If Drive()\Type = Search_Type Or Search_Type = -1
			
			SHGetFileInfo_(Drive()\Letter, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME)
			Drive()\DisplayName = PeekS(@FileInfo\szDisplayName)
			*DriveName = AllocateMemory(#MAX_PATH)
			If *DriveName
				*DriveFileSystem = AllocateMemory(#MAX_PATH)
				If *DriveFileSystem
					GetVolumeInformation_(Drive()\Letter, *DriveName, #MAX_PATH, 0, 0, 0, *DriveFileSystem, #MAX_PATH) ; Récupère le nom du volume et le type du système de fichier
					Drive()\Name = PeekS(*DriveName)
					Drive()\FileSystem = PeekS(*DriveFileSystem)
					FreeMemory(*DriveFileSystem)
				EndIf
				FreeMemory(*DriveName)
			EndIf
			
			
		Else
			DeleteElement(Drive())
		EndIf
	Next
	
	FreeMemory(*DriveString)
	
EndProcedure




;- Debut du test

; Création de la fenêtre
If OpenWindow(0, 0, 0, 720, 200, "Lecteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
	End
EndIf

GetDrive()

ListIconGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), "Lettre", 40, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(0, 1, "Type", 40)
AddGadgetColumn(0, 2, "Nom", 200)
AddGadgetColumn(0, 3, "Nom affiché dans l'explorateur", 300)
AddGadgetColumn(0, 4, "Système de fichier", 100)
ForEach Drive()
	AddGadgetItem(0, -1, Drive()\Letter + Chr(10) + Str(Drive()\Type) + Chr(10) + Drive()\Name + Chr(10) + Drive()\DisplayName + Chr(10) + Drive()\FileSystem)
Next

Repeat
	Event = WaitWindowEvent()
	
Until Event = #PB_Event_CloseWindow



Re: Lister tous les lecteurs

Publié : dim. 11/déc./2011 21:50
par Ar-S
Nickel !

Re: Lister tous les lecteurs

Publié : dim. 11/déc./2011 22:23
par Le Soldat Inconnu
Et re mise à jour, ce n’était pas compatible unicode

Code : Tout sélectionner

Procedure GetDrive(Search_Type.l = -1)
	Structure DriveInfos
		Letter.s
		Type.l
		Name.s
		DisplayName.s
		FileSystem.s
	EndStructure
	Global NewList Drive.DriveInfos()
	
	; Les valeurs retounées dans le type de lecteur
	; #DRIVE_UNKNOWN = 0 ; The Drive Type cannot be determined.
	; #DRIVE_NO_ROOT_DIR = 1 ; The root Path is invalid; for example, there is no volume is mounted at the path.
	; #DRIVE_REMOVABLE = 2 ; The Drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.
	; #DRIVE_FIXED = 3 ; The Drive has fixed media; for example, a hard drive or flash drive.
	; #DRIVE_REMOTE = 4 ; The Drive is a remote (network) Drive.
	; #DRIVE_CDROM= 5 ; The Drive is a CD-ROM Drive.
	; #DRIVE_RAMDISK = 6 ; The drive is a RAM disk.
	
	Protected DriveString_Length.l, DriveString.s, DriveIndex.l, FileInfo.SHFILEINFO, DriveName.s, DriveFileSystem.s, CharSize.b
	
	; Vide la liste
	ClearList(Drive())
	
	; Taille des caractères en byte
	CharSize = StringByteLength(" ")
	
	; Récupère la liste des lecteurs
	DriveString_Length = GetLogicalDriveStrings_(0, 0)
	DriveString = Space(DriveString_Length)
	DriveString_Length * CharSize
	GetLogicalDriveStrings_(DriveString_Length, @DriveString)
	
	DriveIndex = 0
	Repeat
		AddElement(Drive())
		
		Drive()\Letter = PeekS(@DriveString + DriveIndex) ; Lettre
		
		Drive()\Type = GetDriveType_(@Drive()\Letter) ; Type de lecteur
		
		
		If Drive()\Type = Search_Type Or Search_Type = -1
			
			SHGetFileInfo_(Drive()\Letter, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME)
			Drive()\DisplayName = PeekS(@FileInfo\szDisplayName)
			DriveName = Space(#MAX_PATH)
			DriveFileSystem = Space(#MAX_PATH)
			GetVolumeInformation_(Drive()\Letter, @DriveName, #MAX_PATH, 0, 0, 0, @DriveFileSystem, #MAX_PATH) ; Récupère le nom du volume et le type du système de fichier
			Drive()\Name = DriveName
			Drive()\FileSystem = DriveFileSystem
			
		Else
			DeleteElement(Drive())
		EndIf
		
		DriveIndex + StringByteLength(DriveString) + CharSize
		
	Until DriveIndex >= DriveString_Length - CharSize
	
EndProcedure

Re: Lister tous les lecteurs

Publié : lun. 12/déc./2011 8:35
par MLD
Super LSI comme dab :lol:

Re: Lister tous les lecteurs

Publié : sam. 24/déc./2011 11:41
par Le Soldat Inconnu
Et encore une petite mise à jour

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.6

; Explication du programme :
; Récupérer la lettre et le type (disquette, disque dur, etc...) de tous les lecteurs présents sur l'ordinateur.



Procedure GetDrive(Search_Type.l = -1)
	Structure DriveInfos
		Letter.s
		Type.l
		Name.s
		DisplayName.s
		FileSystem.s
	EndStructure
	Global NewList Drive.DriveInfos()
	
	; Les valeurs retounées dans le type de lecteur
	; #DRIVE_UNKNOWN = 0 ; The Drive Type cannot be determined.
	; #DRIVE_NO_ROOT_DIR = 1 ; The root Path is invalid; for example, there is no volume is mounted at the path.
	; #DRIVE_REMOVABLE = 2 ; The Drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.
	; #DRIVE_FIXED = 3 ; The Drive has fixed media; for example, a hard drive or flash drive.
	; #DRIVE_REMOTE = 4 ; The Drive is a remote (network) Drive.
	; #DRIVE_CDROM= 5 ; The Drive is a CD-ROM Drive.
	; #DRIVE_RAMDISK = 6 ; The drive is a RAM disk.
	
	Protected DriveString_Length.l, DriveString.s, DriveIndex.l, FileInfo.SHFILEINFO, DriveName.s, DriveFileSystem.s, CharSize.b
	
	; Vide la liste
	ClearList(Drive())
	
	; Taille des caractères en byte
	CharSize = StringByteLength(" ")
	
	; Récupère la liste des lecteurs
	DriveString_Length = GetLogicalDriveStrings_(0, 0)
	DriveString = Space(DriveString_Length)
	DriveString_Length * CharSize
	GetLogicalDriveStrings_(DriveString_Length, @DriveString)
	
	DriveIndex = 0
	Repeat
		AddElement(Drive())
		
		Drive()\Letter = PeekS(@DriveString + DriveIndex) ; Lettre
		Drive()\Letter = StringField(Drive()\Letter , 1, ":") + ":"
		
		Drive()\Type = GetDriveType_(@Drive()\Letter) ; Type de lecteur
		
		
		If Drive()\Type = Search_Type Or Search_Type = -1
			
			SHGetFileInfo_(Drive()\Letter + "\", 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME)
			Drive()\DisplayName = Trim(PeekS(@FileInfo\szDisplayName))
			DriveName = Space(#MAX_PATH)
			DriveFileSystem = Space(#MAX_PATH)
			GetVolumeInformation_(Drive()\Letter + "\", @DriveName, #MAX_PATH, 0, 0, 0, @DriveFileSystem, #MAX_PATH) ; Récupère le nom du volume et le type du système de fichier
			Drive()\Name = Trim(DriveName)
			Drive()\FileSystem = Trim(DriveFileSystem)
			
		Else
			DeleteElement(Drive())
		EndIf
		
		DriveIndex + StringByteLength(DriveString) + CharSize
		
	Until DriveIndex >= DriveString_Length - CharSize
	
EndProcedure




;- Debut du test

; Création de la fenêtre
If OpenWindow(0, 0, 0, 720, 200, "Lecteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
	End
EndIf

GetDrive()

ListIconGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), "Lettre", 40, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(0, 1, "Type", 40)
AddGadgetColumn(0, 2, "Nom", 200)
AddGadgetColumn(0, 3, "Nom affiché dans l'explorateur", 300)
AddGadgetColumn(0, 4, "Système de fichier", 100)
ForEach Drive()
	AddGadgetItem(0, -1, Drive()\Letter + Chr(10) + Str(Drive()\Type) + Chr(10) + Drive()\Name + Chr(10) + Drive()\DisplayName + Chr(10) + Drive()\FileSystem)
Next

Repeat
	Event = WaitWindowEvent()
	
Until Event = #PB_Event_CloseWindow