J'ai un bout de code VB6.0 qui permet d'obtenir la liste des clusters d'un fichier (Merci à ShareVB en passant car c'est lui l'auteur)
Je cherche à le traduire en VB Net 2005 mais je bute sur les paramètres de Deviceiocontrol
Qui pourrait m'aider ?
Voici le code
'contient des informations sur les clusters d'un fichier
Public Type fileClusters
File As String 'nom du fichier
Moveable As Long 'indique si le fichier est déplacable
ExtentsCount As Long 'nombre de fragment du fichier
Extents() As Extent 'liste des fragments
End Type
'contient une partie de la carte des clusters d'un fichier
Private Type RETRIEVAL_POINTERS_BUFFER
'nombre de clusters du fichier
ExtentCount As Long
Padding As Long
'taille du fichier en clusters
StartingVcn As Currency
'liste des fragments du fichiers
Extents(511) As Extent
End Type
'permet de récupérer la carte de l'occupation des clusters sur un disque
Private Const FSCTL_GET_RETRIEVAL_POINTERS As Long = 589939
'indique que l'on n'a pas encore fini de lire la carte d'occupation
Private Const ERROR_MORE_DATA As Long = 234
'récupère la liste des clusters du fichier File
'==============================================
'File : fichier dont on veut la liste des fragments
'renvoie une structure
Public Function GetFileBitmap(File As String) As fileClusters
Dim hFile As Long 'handle de fichier dont on veut la carte des clusters
Dim FileBitmap As RETRIEVAL_POINTERS_BUFFER 'carte des clusters du fichier
Dim nExtents As Long 'nombre d'extents (fragments) du fichier
Dim StartingAddress As Currency 'VCN de début de la carte du fichier
Dim bt As Long 'nombre d'octets renvoyés
Dim status As Long 'état de l'opération
'ouvre le fichier avec les droits de la déplacer juste pour voir si on pourrait le déplacer
hFile = CreateFile(File, FILE_READ_ACCESS Or Delete, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
'copie le nom du fichier
GetFileBitmap.File = File
'si on ne peut pas l'ouvrir pour déplacement
If hFile = -1 Then
'pas déplacable
GetFileBitmap.Moveable = False
'on essaie de l'ouvrir en lecture
hFile = CreateFile(File, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
'si pas possible : fichier système vital
If hFile = -1 Then Exit Function
Else
'déplacable
GetFileBitmap.Moveable = True
End If
'on demande la carte complète du fichier donc depuis le début
StartingAddress = 0
'on demande la carte du fichier tant qu'il y en a encore à récupérer
Do
DoEvents
'demande un morceau de 512 fragments
DeviceIoControl hFile, FSCTL_GET_RETRIEVAL_POINTERS, StartingAddress, 8&, FileBitmap, Len(FileBitmap), bt, 0&
status = Err.LastDllError
'si la partie contient des fragments
If FileBitmap.ExtentCount Then
'ajoute le nombre de fragments de la partie de carte au nombre de fragments du fichier
GetFileBitmap.ExtentsCount = GetFileBitmap.ExtentsCount + FileBitmap.ExtentCount
'fait de la place pour ajouter les fragments
ReDim Preserve GetFileBitmap.Extents(GetFileBitmap.ExtentsCount - 1)
End If
'si le nombre de fragments est > 512
If FileBitmap.ExtentCount > 512 Then
'on copie les 512 premier fragments, car notre structure allouée ne peut pas en contenir plus
CopyMemory GetFileBitmap.Extents(nExtents), FileBitmap.Extents(0), 512& * 16&
'on avance de 512 fragments
nExtents = nExtents + 512
'sinon s'il y a moins de 512 fragments dans la partie de carte
ElseIf FileBitmap.ExtentCount Then
'on les copie
CopyMemory GetFileBitmap.Extents(nExtents), FileBitmap.Extents(0), FileBitmap.ExtentCount * 16&
'on avance du nombre de fragments renvoyés
nExtents = nExtents + FileBitmap.ExtentCount
End If
'on avance dans le fichier jusqu'à l'offset (depuis le début du fichier) du prochain fragment après ceux que l'on a déjà obtenus
StartingAddress = FileBitmap.Extents(511).NextVcn
'tant que l'on n'est pas à la fin des fragments du fichier
Loop While status = ERROR_MORE_DATA
CloseHandle hFile