OVH Cloud OVH Cloud

Type de Lecteur

8 réponses
Avatar
Laurent B
Salut,

Je reviens sur un post que j'ai soumis le 25/06/04 :

Comment savoir quels types de lecteurs on r=E9cup=E9re=20
lorsque l'on fait "Directory.GetLogicalDrives()".

En fait il faut utiliser : ""Scripting.FileSystemObject"

*****************************************
Sub AfficheTypeLecteur(ByVal drvpath)
Dim fs, d, s, t
fs =3D CreateObject("Scripting.FileSystemObject")
d =3D fs.GetDrive(drvpath)
Select Case d.DriveType
Case 0 : t =3D "Inconnu"
Case 1 : t =3D "Amovible"
Case 2 : t =3D "Fixe"
Case 3 : t =3D "R=E9seau"
Case 4 : t =3D "CD-ROM"
Case 5 : t =3D "Disque RAM"
End Select
s =3D "Lecteur " & d.DriveLetter & ": - " & t
MsgBox(s)
End Sub
*****************************************

Voila, c'est juste pour ceux que =E7a interresse parceque=20
c'est pas =E9vident =E0 d=E9nicher dans l'aide en ligne.

A ++

Laurent

8 réponses

Avatar
Christophe
je pense que c mieux par API, car là tu fait appel à un objet COM...


"Laurent B" a écrit dans le message de
news:24b9a01c45ffb$12ea46f0$
Salut,

Je reviens sur un post que j'ai soumis le 25/06/04 :

Comment savoir quels types de lecteurs on récupére
lorsque l'on fait "Directory.GetLogicalDrives()".

En fait il faut utiliser : ""Scripting.FileSystemObject"

*****************************************
Sub AfficheTypeLecteur(ByVal drvpath)
Dim fs, d, s, t
fs = CreateObject("Scripting.FileSystemObject")
d = fs.GetDrive(drvpath)
Select Case d.DriveType
Case 0 : t = "Inconnu"
Case 1 : t = "Amovible"
Case 2 : t = "Fixe"
Case 3 : t = "Réseau"
Case 4 : t = "CD-ROM"
Case 5 : t = "Disque RAM"
End Select
s = "Lecteur " & d.DriveLetter & ": - " & t
MsgBox(s)
End Sub
*****************************************

Voila, c'est juste pour ceux que ça interresse parceque
c'est pas évident à dénicher dans l'aide en ligne.

A ++

Laurent
Avatar
Laurent B
Tu as sans doute raison, mais le probléme, c'est que :

Si je fais ce code en VB 6.0, ça marche du tonnerre,
par contre en VB.Net je récupére une série de chiffres
que je n'arrive pas à exploiter.
Si quelq'un peut m'aider, merci d'avance ...

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Const CDRom = 5
Private Const Fixed = 3
Private Const RamDisk = 6
Private Const Remote = 4
Private Const Removable = 2


Private Sub Command1_Click()
typeL = GetDriveType("C:")
Dim s As String
Select Case typeL
Case Removable: s = "Amovible"
Case Fixed: s = "Fixe"
Case Remote: s = "Réseau"
Case CDRom: s = "CD-ROM"
Case RamDisk: s = "Disque RAM"
Case Else: s = "Inconnu"
End Select

MsgBox (s)
End Sub



///////////////////////////////////////////////////////
-----Message d'origine-----
je pense que c mieux par API, car là tu fait appel à un


objet COM...
Avatar
Letchideslandes
Laurent B a écrit :
Tu as sans doute raison, mais le probléme, c'est que :

Si je fais ce code en VB 6.0, ça marche du tonnerre,
par contre en VB.Net je récupére une série de chiffres
que je n'arrive pas à exploiter.
Si quelq'un peut m'aider, merci d'avance ...

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Const CDRom = 5
Private Const Fixed = 3
Private Const RamDisk = 6
Private Const Remote = 4
Private Const Removable = 2


Private Sub Command1_Click()
typeL = GetDriveType("C:")
Dim s As String
Select Case typeL
Case Removable: s = "Amovible"
Case Fixed: s = "Fixe"
Case Remote: s = "Réseau"
Case CDRom: s = "CD-ROM"
Case RamDisk: s = "Disque RAM"
Case Else: s = "Inconnu"
End Select

MsgBox (s)
End Sub



///////////////////////////////////////////////////////

-----Message d'origine-----
je pense que c mieux par API, car là tu fait appel à un



objet COM...



une classe que j'avais ecrite :
Public Enum TypeLecteur
Inconnu = 0
CheminInvalide = 1
Amovible = 2
DisqueInterne = 3
DisqueReseau = 4
CDRom = 5
RAMDisk = 6
End Enum

Public Class InformationVolume
Dim _volume As String

#Region " Déclarations fonctions kernel32"
Private Declare Auto Function GetDriveType Lib "kernel32.dll"
(ByVal lpRootPathName As String) As TypeLecteur
Private Declare Auto Sub GetVolumeInformation Lib
"kernel32.dll" ( _
ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As StringBuilder, _
ByRef nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer, _
ByRef lpMaximumComponentLength As Integer, _
ByRef lpFileSystemFlags As Integer, _
ByVal lpFileSystemNameBuffer As StringBuilder, _
ByRef nFileSystemNameSize As Integer)

Private Declare Auto Sub GetDiskFreeSpaceEx Lib "kernel32.dll" ( _
ByVal lpDirectoryName As String, _
ByRef lpFreeBytesAvailable As Int64, _
ByRef lpTotalNumberOfBytes As Int64, _
ByRef lpTotalNumberOfFreeBytes As Int64)
#End Region

#Region " Structures Privées"

Private Structure Taille
Dim LibreDisponible As Int64
Dim Total As Int64
Dim TotalLibre As Int64
End Structure

Private Structure InformationVolume
Dim NomVolume As String
Dim NumeroSerie As Integer
Dim SystemeFichier As String
End Structure
#End Region

Public Sub New(ByVal Volume As String)
_volume = Volume
End Sub

#Region " Fonctions privées"

Private Function dotnet_GetDriveType() As TypeLecteur
Return GetDriveType(_volume)
End Function

Private Function dotnet_GetVolumeInformation() As InformationVolume
Dim VolumeNameBuffer As New StringBuilder(255)
Dim VolumeSerialNumber As Integer
Dim MaximumComponentLength As Integer
Dim FileSystemFlags As Integer
Dim FileSystemNameBuffer As New StringBuilder(255)


GetVolumeInformation(_volume, VolumeNameBuffer,
VolumeNameBuffer.Capacity, VolumeSerialNumber, _
MaximumComponentLength, FileSystemFlags,
FileSystemNameBuffer, FileSystemNameBuffer.Capacity)
With dotnet_GetVolumeInformation
.SystemeFichier = FileSystemNameBuffer.ToString
.NomVolume = VolumeNameBuffer.ToString
.NumeroSerie = VolumeSerialNumber
End With
End Function

Private Function dotnet_GetDiskFreeSpaceEx() As Taille
Dim _information As Taille
GetDiskFreeSpaceEx(_volume, _information.LibreDisponible,
_information.Total, _information.TotalLibre)
Return _information
End Function

#End Region

#Region " Propriétes publiques"

ReadOnly Property Volume() As String
Get
Return _volume
End Get
End Property

ReadOnly Property Type() As TypeLecteur
Get
Return dotnet_GetDriveType()
End Get
End Property

ReadOnly Property EspaceLibreDisponible() As Int64
Get
Return dotnet_GetDiskFreeSpaceEx.LibreDisponible
End Get
End Property

ReadOnly Property NomVolume() As String
Get
Return dotnet_GetVolumeInformation.NomVolume
End Get
End Property

ReadOnly Property TailleMax() As Int64
Get
Return dotnet_GetDiskFreeSpaceEx.Total
End Get
End Property

#End Region

End Class

--
http://perso.wanadoo.fr/letchideslandes
Avatar
Laurent B
Ok et merci "Letchideslandes"

Une fois simplifié et juste pour l'utilisation dont j'ai
besoin, c'est à dire récuperer le type du lecteur, ça
donne ça :

Public Enum TypeLecteur
Inconnu = 0
CheminInvalide = 1
Amovible = 2
DisqueInterne = 3
DisqueReseau = 4
CDRom = 5
RAMDisk = 6
End Enum

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As
TypeLecteur

Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click

Dim TypeL = GetDriveType("H:")
Dim s As String
Select Case TypeL
Case 1 : s = "Non-dispo"
Case 2 : s = "Amovible"
Case 3 : s = "Disque dur"
Case 4 : s = "Réseau"
Case 5 : s = "CDRom"
Case 6 : s = "Ram"
Case Else : s = "Inconnu"
End Select

MsgBox(s)

End Sub

Laurent

/////////////////////////////////////////////////////////
-----Message d'origine-----
Laurent B a écrit :
Tu as sans doute raison, mais le probléme, c'est que :

Si je fais ce code en VB 6.0, ça marche du tonnerre,
par contre en VB.Net je récupére une série de chiffres
que je n'arrive pas à exploiter.
Si quelq'un peut m'aider, merci d'avance ...

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Const CDRom = 5
Private Const Fixed = 3
Private Const RamDisk = 6
Private Const Remote = 4
Private Const Removable = 2


Private Sub Command1_Click()
typeL = GetDriveType("C:")
Dim s As String
Select Case typeL
Case Removable: s = "Amovible"
Case Fixed: s = "Fixe"
Case Remote: s = "Réseau"
Case CDRom: s = "CD-ROM"
Case RamDisk: s = "Disque RAM"
Case Else: s = "Inconnu"
End Select

MsgBox (s)
End Sub



///////////////////////////////////////////////////////

-----Message d'origine-----
je pense que c mieux par API, car là tu fait appel à






un

objet COM...



une classe que j'avais ecrite :
Public Enum TypeLecteur
Inconnu = 0
CheminInvalide = 1
Amovible = 2
DisqueInterne = 3
DisqueReseau = 4
CDRom = 5
RAMDisk = 6
End Enum

Public Class InformationVolume
Dim _volume As String

#Region " Déclarations fonctions kernel32"
Private Declare Auto Function GetDriveType


Lib "kernel32.dll"
(ByVal lpRootPathName As String) As TypeLecteur
Private Declare Auto Sub GetVolumeInformation


Lib
"kernel32.dll" ( _
ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As StringBuilder, _
ByRef nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer, _
ByRef lpMaximumComponentLength As Integer, _
ByRef lpFileSystemFlags As Integer, _
ByVal lpFileSystemNameBuffer As


StringBuilder, _
ByRef nFileSystemNameSize As Integer)

Private Declare Auto Sub GetDiskFreeSpaceEx


Lib "kernel32.dll" ( _
ByVal lpDirectoryName As String, _
ByRef lpFreeBytesAvailable As Int64, _
ByRef lpTotalNumberOfBytes As Int64, _
ByRef lpTotalNumberOfFreeBytes As Int64)
#End Region

#Region " Structures Privées"

Private Structure Taille
Dim LibreDisponible As Int64
Dim Total As Int64
Dim TotalLibre As Int64
End Structure

Private Structure InformationVolume
Dim NomVolume As String
Dim NumeroSerie As Integer
Dim SystemeFichier As String
End Structure
#End Region

Public Sub New(ByVal Volume As String)
_volume = Volume
End Sub

#Region " Fonctions privées"

Private Function dotnet_GetDriveType() As


TypeLecteur
Return GetDriveType(_volume)
End Function

Private Function dotnet_GetVolumeInformation()


As InformationVolume
Dim VolumeNameBuffer As New StringBuilder


(255)
Dim VolumeSerialNumber As Integer
Dim MaximumComponentLength As Integer
Dim FileSystemFlags As Integer
Dim FileSystemNameBuffer As New


StringBuilder(255)


GetVolumeInformation(_volume,


VolumeNameBuffer,
VolumeNameBuffer.Capacity, VolumeSerialNumber, _
MaximumComponentLength,


FileSystemFlags,
FileSystemNameBuffer, FileSystemNameBuffer.Capacity)
With dotnet_GetVolumeInformation
.SystemeFichier =


FileSystemNameBuffer.ToString
.NomVolume = VolumeNameBuffer.ToString
.NumeroSerie = VolumeSerialNumber
End With
End Function

Private Function dotnet_GetDiskFreeSpaceEx() As


Taille
Dim _information As Taille
GetDiskFreeSpaceEx(_volume,


_information.LibreDisponible,
_information.Total, _information.TotalLibre)
Return _information
End Function

#End Region

#Region " Propriétes publiques"

ReadOnly Property Volume() As String
Get
Return _volume
End Get
End Property

ReadOnly Property Type() As TypeLecteur
Get
Return dotnet_GetDriveType()
End Get
End Property

ReadOnly Property EspaceLibreDisponible() As


Int64
Get
Return


dotnet_GetDiskFreeSpaceEx.LibreDisponible
End Get
End Property

ReadOnly Property NomVolume() As String
Get
Return


dotnet_GetVolumeInformation.NomVolume
End Get
End Property

ReadOnly Property TailleMax() As Int64
Get
Return dotnet_GetDiskFreeSpaceEx.Total
End Get
End Property

#End Region

End Class

--
http://perso.wanadoo.fr/letchideslandes
.



Avatar
Letchideslandes
Laurent B a écrit :
Ok et merci "Letchideslandes"

Une fois simplifié et juste pour l'utilisation dont j'ai
besoin, c'est à dire récuperer le type du lecteur, ça
donne ça :

Public Enum TypeLecteur
Inconnu = 0
CheminInvalide = 1
Amovible = 2
DisqueInterne = 3
DisqueReseau = 4
CDRom = 5
RAMDisk = 6
End Enum

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As
TypeLecteur

Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click

Dim TypeL = GetDriveType("H:")
Dim s As String
Select Case TypeL
Case 1 : s = "Non-dispo"
Case 2 : s = "Amovible"
Case 3 : s = "Disque dur"
Case 4 : s = "Réseau"
Case 5 : s = "CDRom"
Case 6 : s = "Ram"
Case Else : s = "Inconnu"
End Select

MsgBox(s)

End Sub

Laurent

/////////////////////////////////////////////////////////

-----Message d'origine-----
Laurent B a écrit :

Tu as sans doute raison, mais le probléme, c'est que :

Si je fais ce code en VB 6.0, ça marche du tonnerre,
par contre en VB.Net je récupére une série de chiffres
que je n'arrive pas à exploiter.
Si quelq'un peut m'aider, merci d'avance ...

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Const CDRom = 5
Private Const Fixed = 3
Private Const RamDisk = 6
Private Const Remote = 4
Private Const Removable = 2


Private Sub Command1_Click()
typeL = GetDriveType("C:")
Dim s As String
Select Case typeL
Case Removable: s = "Amovible"
Case Fixed: s = "Fixe"
Case Remote: s = "Réseau"
Case CDRom: s = "CD-ROM"
Case RamDisk: s = "Disque RAM"
Case Else: s = "Inconnu"
End Select

MsgBox (s)
End Sub



///////////////////////////////////////////////////////


-----Message d'origine-----
je pense que c mieux par API, car là tu fait appel à







un

objet COM...




une classe que j'avais ecrite :
Public Enum TypeLecteur
Inconnu = 0
CheminInvalide = 1
Amovible = 2
DisqueInterne = 3
DisqueReseau = 4
CDRom = 5
RAMDisk = 6
End Enum

Public Class InformationVolume
Dim _volume As String

#Region " Déclarations fonctions kernel32"
Private Declare Auto Function GetDriveType



Lib "kernel32.dll"

(ByVal lpRootPathName As String) As TypeLecteur
Private Declare Auto Sub GetVolumeInformation



Lib

"kernel32.dll" ( _
ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As StringBuilder, _
ByRef nVolumeNameSize As Integer, _
ByRef lpVolumeSerialNumber As Integer, _
ByRef lpMaximumComponentLength As Integer, _
ByRef lpFileSystemFlags As Integer, _
ByVal lpFileSystemNameBuffer As



StringBuilder, _

ByRef nFileSystemNameSize As Integer)

Private Declare Auto Sub GetDiskFreeSpaceEx



Lib "kernel32.dll" ( _

ByVal lpDirectoryName As String, _
ByRef lpFreeBytesAvailable As Int64, _
ByRef lpTotalNumberOfBytes As Int64, _
ByRef lpTotalNumberOfFreeBytes As Int64)
#End Region

#Region " Structures Privées"

Private Structure Taille
Dim LibreDisponible As Int64
Dim Total As Int64
Dim TotalLibre As Int64
End Structure

Private Structure InformationVolume
Dim NomVolume As String
Dim NumeroSerie As Integer
Dim SystemeFichier As String
End Structure
#End Region

Public Sub New(ByVal Volume As String)
_volume = Volume
End Sub

#Region " Fonctions privées"

Private Function dotnet_GetDriveType() As



TypeLecteur

Return GetDriveType(_volume)
End Function

Private Function dotnet_GetVolumeInformation()



As InformationVolume

Dim VolumeNameBuffer As New StringBuilder



(255)

Dim VolumeSerialNumber As Integer
Dim MaximumComponentLength As Integer
Dim FileSystemFlags As Integer
Dim FileSystemNameBuffer As New



StringBuilder(255)


GetVolumeInformation(_volume,



VolumeNameBuffer,

VolumeNameBuffer.Capacity, VolumeSerialNumber, _
MaximumComponentLength,



FileSystemFlags,

FileSystemNameBuffer, FileSystemNameBuffer.Capacity)
With dotnet_GetVolumeInformation
.SystemeFichier =



FileSystemNameBuffer.ToString

.NomVolume = VolumeNameBuffer.ToString
.NumeroSerie = VolumeSerialNumber
End With
End Function

Private Function dotnet_GetDiskFreeSpaceEx() As



Taille

Dim _information As Taille
GetDiskFreeSpaceEx(_volume,



_information.LibreDisponible,

_information.Total, _information.TotalLibre)
Return _information
End Function

#End Region

#Region " Propriétes publiques"

ReadOnly Property Volume() As String
Get
Return _volume
End Get
End Property

ReadOnly Property Type() As TypeLecteur
Get
Return dotnet_GetDriveType()
End Get
End Property

ReadOnly Property EspaceLibreDisponible() As



Int64

Get
Return



dotnet_GetDiskFreeSpaceEx.LibreDisponible

End Get
End Property

ReadOnly Property NomVolume() As String
Get
Return



dotnet_GetVolumeInformation.NomVolume

End Get
End Property

ReadOnly Property TailleMax() As Int64
Get
Return dotnet_GetDiskFreeSpaceEx.Total
End Get
End Property

#End Region

End Class

--
http://perso.wanadoo.fr/letchideslandes
.









tu peux suprimer ton select case et faire

messagebox.show(getdrivetype("H:").tostring)


--
http://perso.wanadoo.fr/letchideslandes
Avatar
Affirmatif, mais là l'exemple de code est simplifié.

En fait j'ai besoin de recuperer le type de lecteur :

1) Pour remplir un treeview à partir duquel l'utilisateur
va configurer un dossier pour le stockage des bases de
données de mon appli. Donc pour attribuer les icônes
correspondantes à chaque lecteur.

2) Pour savoir si le dossier des bases de données se
trouve en local ou sur un serveur. Auquel cas si c'est
sur un serveur, initialiser la connexion à ce serveur au
lancement de l'appli.

Merci encore,

Laurent

///////////////////////////////////////////////////

tu peux suprimer ton select case et faire

messagebox.show(getdrivetype("H:").tostring)


--
http://perso.wanadoo.fr/letchideslandes
.



Avatar
Zoury
> En fait il faut utiliser : ""Scripting.FileSystemObject"



Cette composante est aussi très connue sous l'accronyme FSO...
personnellement je déconseilles fortement son utilisation, l'article suivant
pourrait t'intéresser :
http://faq.vb.free.fr/?question6

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
Salut! :O)

Tu as sans doute raison,



... dur à dire.. l'argumentation n'est pas assez explicite pour en venir à
une conclusion.. ;O)


mais le probléme, c'est que :
Si je fais ce code en VB 6.0, ça marche du tonnerre,
par contre en VB.Net je récupére une série de chiffres
que je n'arrive pas à exploiter.



<snip>

Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long




Regarde attentivement la déclaration signature de la fonction GetDriveType()
en C++ :
'***
UINT GetDriveType(
LPCTSTR lpRootPathName
);
'***

UINT est un unsigned int qui prend 4 octets en mémoire vive OR le type Long
en .NET prend 8 octets en mémoire (Int64) .

On obtiendrais donc la déclaration suivante :
'***
Private Declare Auto Function GetDriveType _
Lib "kernel32.dll" _
( _
ByVal lpRootPathName As String _
) As UInt32 ' ou As Integer, mais UINT se map mieux sur un UInt32
'***

Maintenant, le code proposé par Letchideslandes fonctionne aussi.. pourquoi?
Parce que le type renvoyé par GetDriveType() est l'énumération TypeLecteur
qui est représenté par des valeurs de type Int32 par défaut (4 octets). Il
serait toutefois plus juste, amha, de déclaré TypeLecteur ainsi :
'***
Private Type TypeLecteur : UInt32
' ...
End Type
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/