Lister tous les lecteurs

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 :

Lister tous les lecteurs

Message 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
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)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Lister tous les lecteurs

Message 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


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)]
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Lister tous les lecteurs

Message par Ar-S »

Nickel !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Lister tous les lecteurs

Message 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
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)]
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Lister tous les lecteurs

Message par MLD »

Super LSI comme dab :lol:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Lister tous les lecteurs

Message 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


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