Clusters fichier [Résolu]

cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 9 mars 2008 à 02:35 - Dernière réponse : cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention
- 11 juil. 2008 à 13:46
Salut à tous

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

End Function

Merci à tous pour votre aide et bonne prog

GRENIER Alain
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 11 juil. 2008 à 13:45
3
Merci
GRENIER Alain

Merci cs_Galain 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_Galain
Meilleure réponse
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 11 juil. 2008 à 13:46
3
Merci
J'ai réuusi à solutionner mon problème
GRENIER Alain

Merci cs_Galain 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_Galain

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.