Savoir quel fichier est sur quel cluster.

Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
- - Dernière réponse :  vb95 - 4 sept. 2016 à 14:07
Violent Ken

Bonjour (bonsoir) à tous.

J'ai une question un peu complexe.

C'est peu être impossible à faire, mais j'aimerais savoir comment pouvoir déterminer quel fichier occupe un cluster spécifique.

En fait, mon programme affiche le contenu d'un disque physique en "accès direct", et j'aimerais pouvoir dire quelle zone du disque constitue quel fichier.

Par exemple, j'aimerais savoir à quel fichier appartient la séquence
 CB  4A 86 8A EB 33 7E DA DD          ËJ†Šë3~ÚÝ
qui existe au secteur physique 310783 de ma clé USB.

Si c'est impossible (si vous en êtes sur), merci de me le dire ;)
(c'est évidemment possible en C, ma question est "comment faire en VB6")

PS : inutile de me dire "go to cppfrance.com", mon programme est en VB6 et pas en C ;)

Merci beaucoup, @+
Afficher la suite 

Votre réponse

20/23 réponses

Messages postés
260
Date d'inscription
mardi 25 novembre 2003
Dernière intervention
6 novembre 2009
0
Merci
Salut,
Tu as déjà été voir :
http://www.vbfrance.com/codes/ACCES-DIRECT-DISQUE_32480.aspx  ??

Ca devrait te mettre sur la piste.

Jcbé[^]
Commenter la réponse de TMONOD
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
0
Merci
salut,

euh, oui..quelle source !!! cependant elle fait planter VB chez moi...c'est sûr que c'est un gros boulot mais côté "reusability" c'est forcément évident...

enfin dans tous les cas, il me semble qu'il y ait plus simple :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/disk_management_control_codes.asp et FSCTL_GET_RETRIEVAL_POINTERS...

Option Explicit

Private Const FSCTL_GET_NTFS_VOLUME_DATA As Long = 589924
Private Const FSCTL_GET_NTFS_FILE_RECORD As Long = 589928
Private Const FSCTL_GET_RETRIEVAL_POINTERS As Long = 589939
Private Const FSCTL_MOVE_FILE As Long = 589940
Private Const FSCTL_IS_VOLUME_DIRTY As Long = 589944

'
' Structure for FSCTL_GET_RETRIEVAL_POINTERS
'
Private Type STARTING_VCN_INPUT_BUFFER
    StartingVcn As LARGE_INTEGER
End Type 'STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;

Private Type Extent
    NextVcn As LARGE_INTEGER
    LCN As LARGE_INTEGER
End Type 'Extents[1];
Private Type RETRIEVAL_POINTERS_BUFFER
    ExtentCount As Long
    Padding As Long
    StartingVcn As LARGE_INTEGER
    Extents(511) As Extent
End Type 'RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;

'
' Structure for FSCTL_MOVE_FILE
'
Private Type MOVE_FILE_DATA
    FileHandle As Long
    StartingVcn As LARGE_INTEGER
    StartingLcn As LARGE_INTEGER
    ClusterCount As Long
End Type 'MOVE_FILE_DATA, *PMOVE_FILE_DATA;

Public Declare Function DeviceIoControl Lib "kernel32.dll" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long
Public Declare Function GetLastError Lib "kernel32.dll" () As Long
Public Const ERROR_MORE_DATA As Long = 234

'Public Type FileClusters
'    File As String
'    Moveable As Long
'    ExtentsCount As Long
'    Extents() As Extent
'End Type

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
Dim StartingAddress As LARGE_INTEGER '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
Dim x As Long

hFile = CreateFile(File, FILE_READ_ACCESS Or DELETE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
GetFileBitmap.File = File
If hFile = -1 Then
    GetFileBitmap.Moveable = False
    hFile = CreateFile(File, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
    If hFile = -1 Then Exit Function
Else
    GetFileBitmap.Moveable = True
End If

'on demande la carte complète du fichier
StartingAddress.HighDWORD = 0
StartingAddress.LowDWORD = 0

'on demande la carte
Do
    DeviceIoControl hFile, FSCTL_GET_RETRIEVAL_POINTERS, StartingAddress, 8&, FileBitmap, Len(FileBitmap), bt, 0&
    status = Err.LastDllError    'If (FileBitmap.StartingVcn.LowDWORD 0) And (FileBitmap.StartingVcn.HighDWORD 0) Then
        If FileBitmap.ExtentCount Then
            GetFileBitmap.ExtentsCount = GetFileBitmap.ExtentsCount + FileBitmap.ExtentCount
            ReDim Preserve GetFileBitmap.Extents(GetFileBitmap.ExtentsCount - 1)
        End If
    'End If
    If FileBitmap.ExtentCount > 512 Then
        CopyMemory GetFileBitmap.Extents(nExtents), FileBitmap.Extents(0), 512& * 16&
        nExtents = nExtents + 512
    ElseIf FileBitmap.ExtentCount Then
        CopyMemory GetFileBitmap.Extents(nExtents), FileBitmap.Extents(0), FileBitmap.ExtentCount * 16&
        nExtents = nExtents + FileBitmap.ExtentCount
    End If
    StartingAddress.LowDWORD = StartingAddress.LowDWORD + FileBitmap.Extents(511).NextVcn.LowDWORD
    StartingAddress.HighDWORD = StartingAddress.HighDWORD + FileBitmap.Extents(511).NextVcn.HighDWORD
Loop While status = ERROR_MORE_DATA
CloseHandle hFile
End Function

Public Function GetVolumeFilesBitmap(Volume As String, Optional Progress As ProgressBar) As FileClusters()
Dim tmp() As FileClusters
Dim Files() As String
Dim x As Long, ub As Long

GetVolumeFiles Volume, Files, True

ub = UBound(Files)
ReDim tmp(ub)

If IsMissing(Progress) = False Then
    Progress.Min = 0
    Progress.Max = ub + 1
End If
For x = 0 To ub
    tmp(x) = GetFileBitmap(Files(x))    If IsMissing(Progress) False Then Progress.Value Progress.Value + 1: DoEvents
Next
GetVolumeFilesBitmap = tmp
End Function

Option Explicit

Private Const MAX_PATH As Long = 260
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As Long) As Long
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10

Public Sub GetVolumeFiles(ByVal Directory As String, Files() As String, Optional Begin As Boolean = False)
Dim FileInfo As WIN32_FIND_DATA, hFind As Long
Static ub As LongIf Begin True Then ub 0

hFind = FindFirstFile(Directory & "*", FileInfo)
If hFind <> -1 Then
    If (FileInfo.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
        If InStr(FileInfo.cFileName, ".") <> 1 Then GetVolumeFiles Directory & Mid$(FileInfo.cFileName, 1, InStr(FileInfo.cFileName, vbNullChar) - 1) & "", Files, False
    Else
        ub = ub + 1
        ReDim Preserve Files(ub)
        Files(ub) = Directory & Mid$(FileInfo.cFileName, 1, InStr(FileInfo.cFileName, vbNullChar) - 1)
    End If
    Do While FindNextFile(hFind, FileInfo)
        If (FileInfo.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
            If InStr(FileInfo.cFileName, ".") <> 1 Then GetVolumeFiles Directory & Mid$(FileInfo.cFileName, 1, InStr(FileInfo.cFileName, vbNullChar) - 1) & "", Files, False
        Else
            ub = ub + 1
            ReDim Preserve Files(ub)
            Files(ub) = Directory & Mid$(FileInfo.cFileName, 1, InStr(FileInfo.cFileName, vbNullChar) - 1)
        End If
    Loop
End If
FindClose hFind
End Sub

ShareVB
Commenter la réponse de ShareVB
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Salut !

Oui, j'ai vu l'excellente source de Galain, mais je m'y perd un peu (!), et il ne me semble pas qu'il y est vraiment la réponse à ma question.
Cela dit, c'est une source extrêmement intéressante, il y a pleins d'exemples d'utilisation d'API dans le domaine de ce que je cherche.


ShareVB ==> La source plante en effet VB chez moi aussi, mais une gestion d'erreur dans le sub Introduction de IntroFrm permet de régler le problème.

Et MERCI beaucoup pour le lien et le code, vraiment...

@+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Salut violent_Ken et ShareVB

le code de ShareVb pour la correspondance clusters-fichiers a l'air très intéressant mais à mon avis il ne gère que le NTFS ( à moins que je me trompe).Peux-t'on formater une clé USB en NTFS ?Je ne pense pas

Pour trouver la correspondance clusters-fichier j'utilise en FAT la table FAT des clusters et les entrées 32 bits des répertoires pour chaque fichier ou dossier de la partition. En NTFS pour chaque fichier ou dossier je vais chercher dans les attributs adéquats la Run List des clusters du fichier ou dossier. Ceci fait que cela est assez lourd à gérer surtout dans les tableaux de correspondance clusters-fichiers tels que je les ai créés.
De plus mon plus gros disque dur fait 20 Go et le programme n'a jamais été testé sur des disques durs ou partitions de 80 ou 200 Go par exemple.Il est  fort possible que des bugs puissent survenir dans ces cas.

Violent_Ken tu dis que la source plante chez toi mais une gestion d'erreur dans la Sub Introduction de IntroFrm règle le problème.Peus-tu m'en dire plus car je n'ai point ce problème

Merci à vous deux et bonne prog

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Salut.

Pour le code de ShareVB, je confirme qu'il marche aussi pour le système de fichier FAT (testé sur ma clé USB).

Pour ton programme, je ne peux pas non plus te dire pour les grosses partition FAT, ma plus grosse partition FAT est ma clé USB de 1Go ;) Mais en tout cas merci pour les précisions sur le fonctionnement de ce dernier avec ce système de fichier.
Pour le bug (chez moi), il se situe dans la Sub Introduction. J'ai pas vraiment cherché très loin, mais je peux te dire que c'est l'erreur 94 (utilisation non autorisée de Null) à la ligne BytesPerSector& Val(recupWMI), pour ldrive$ Listphydrive.List(2)

Je saute le problème avc une gestion simple de l'erreur (If Err.Number=4 then Resume next), mais il en résulte que le programme freeze quand je le lance (dans l'IDE ou compilé). Je n'arrive à le faire tourner qu'en ayant mis un point d'arrêt dans la boucle
For x% = 0 To Listphydrive.ListCount - 1, en débugage dans l'IDE (bizarre).

J'ai aussi systématiquement le message "Erreur d'accès en lecture" (3 fois de suite), et le programme ouvre certaines fois mon lecteur K (indisponible) quand je tente d'accéder au C.

Si çà peux t'aider à debuger :)

@+
Commenter la réponse de violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Je voulais bien sur dire "If err.number=94 then..."

@+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Merci Violent_Ken

1° Bytespersector& = Val(RecupWMI) récupère la taille en octets d'un secteur du disque en cours par l'accès WMI ( si le disque dur avait une autre valeur que 512 octets par secteur va savoir). L'erreur que tu as vient du fait que la valeur récupérée est nulle mais pourquoi ?Peux-tu me dire quelle est le type de lecteur qui engendre cette erreur (ce ne peut pas être un lecteur de disquette ni un disque dur ni un CDROM ou DVDROM car c'est ce que j'ai comme lecteurs et je n'ai aucun problème) ? Est-ce un disque réseau ou autre ?
Si jamais il est  sûr que les lecteurs de disquettes,disques durs,CDROM,DVDROM,clefs USB et tout autre périphérique de stockage ont tous 512 octets par secteur,on peut supprimé cette recherche par WMI  et mettre bytepersector& = 512 directement

2° Quand je parlais de grosses partitions je parlais aussi bien en FAT qu'en NTFS.donc des bugs peuvent apparaitre aussi bien en FAT qu'en NTFS sur des partitions > à 20 Go .Je pourrais tester dans peu de temps car j'envisage l'achat d'un 80 ou 160 Go.

3) Merci de la confirmation du code de ShareVB qui fonctionne en FAT et en NTFS.

bonne prog ,merci bien et @+
GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Salut Violent_Ken
J'ai modifié la sub Introduction dans la feuille Introfrm pour le fameux Bytespersector&= val(RecupWMI). J'ai récupéré cette valeur avec DeviceIoControl et les paramètres de géométrie du disque. Cela fonctionne nickel chez moi.Qu'en est-il chez toi en chargeant le projet mis à jour?

Merci et A+

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken
Salut.

1) Pour l'erreur du "Null", je ne peux pas te dire avec précision pour l'instant (je poste ce message depuis un PC sous Linux, donc pas mon PC et pas de Visual Studio pour tester).

Mais je peux par contre te dire qu'il n'y a uniquement sur mon PC :
-2 disques durs de 200Go en NTFS
-2 lecteurs/graveurs DVD (pas de CD/DVD dedans)
-1 clé 1GO FAT branchée en USB
-4 lecteurs de cartes SD/Flash/... (pas de carte dedans)

Donc pas de lecteur réseau ou autre.

2) J'ai 2 disques durs de 200Go en NTFS. Je suis parvenu à ouvrir un des deux avec ton programme, mais il m'arrive que ton programme tente d'ouvrir le lecteur K à la place (qui est un lecteur de carte Flash, vide).
Pour le premier des deux disques, il ne me semble pas que j'ai pu l'ouvrir sans provoquer de freeze... mais je verrais plus en détail quand je rentrerais chez moi ce soir.
Comme je te l'ai déjà dit, la procédure Introduction bug assez bizarrement, et ne le prog ne démarre que si je pose un point d'arrêt dans la boucle For x%=... Si je pose pas de point d'arrêt, et même en ignorant le bug du "Null" (On error resume next), le programme freeze irrémédiablement.

Ce soir, je vais télécharger ta source et voir si la modification apportée résoud le problème, et je te dirais si je parviens à accéder sans bug aux disques de 200Go.

Merci, @+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Merci de tes précisions
Peux-tu me dire pour tes lecteurs de cartes SD/Flash quel type est renvoyé pour ceux-ci par la fonction GetDriveType et est-ce qu'on te précise de mettre un support dedans  lorsqu'ils apparaissent dans la Listview de la feuille IntroFrm  ( comme pour les  lecteurs de disquettes ou les CDROMs où on demande d'introduire un support) ?
Que ce soient disques durs,lecteurs de disquette,clefs USB et CD ouDVDROMS il ne devrait pas y avoir de problèmes car cela a déjà été testé ( sauf au niveau de la taille des disques durs : j'attends ton tests pour les 200 Go)
Merci de l'aide précieuse que tu m'apportes sur ce projet et à tout à l'heure

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
C'est encore moi violent_Ken
A mon avis il faut tester dans la boucle si les lecteurs affichés dans ListphyDrive sont bien tous des disques durs car il est possible que d'autres types de périphériques de stockage soient reconnus comme des lecteurs physiques sans être des disques durs.Et c'est à ce niveau là qu'il peut y avoir des problèmes.
Qu'en penses tu ?
Les partitions Linux sont en chantier chez moi mais non encore intégrées au projet.
A + et merci

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Salut, alors pour le bug de la sub Introduction, c'est réglé avce la MAJ. De même que le freeze (qui est en fait du à la mauvaise gestion des erreurs par VB6), et de même que les messages "Erreur d'accès en lecture".


Pour les disques de 200Go, plus de bug avec le lecteur K, et il s'ouvrent correctement tout les deux.
Cependant, la sélection de lignes dans le composant Listmft de NtfsFrm peut entrainer l'erreur 30009 (valeur de ligne non valide) à la ligne Listmft.Row = CLng(enregcourant1& \ nbenrg%) + 1 de NtsfFrm. Sans doutes un dépassement de capacité du composant Listmft (affectation d'un Row trop important).


Pour les lecteurs de cartes, oui, on me précise "d'insérer un support".
Le type renvoyé par GetDriveType est 2.


Et effectivement, dans Listphydrive, 4 lecteurs physiques apparaissent (0,1,2,3) alors que je n'en ai que 2 à priori.
J'ajouterais même que si j'augmente le nombre maximum possible de disques physiques (donc si je change la ligne 152 par If numdrive% = 50 Then Exit Do), il apparait 6 drives physiques (0,1,2,3,4,5), ce qui correspond à 2 disques durs + 4 lecteurs de cartes vides (apparait encore un physical drive avec ma clé USB en plus, mais c'est normal). Le problème vient donc probablement de là.


Autre point, après ouverture d'un de mes deux disques durs de 200Go, il apparait le message "Erreur d'accès périphérique", et plus possible d'ouvrir de disque. Cela apparait DANS LE CAS ou ma clé USB est débranchée.
Si cette dernière est branchée, apparait un dépassement de capacité à la ligne 797 de ntfsfrm (pas tout le temps), pour un DD de 200Go, lors la fermeture de cette même form.


Encore autre chose, apparait des fois le message "image non valide" à la ligne Set listImdir = Diricone16.ListImages.Add(, skey$, GetIcon(lecteur$)) de fatfrm, et apparait aussi des fois le message "le controle de cet élément a été supprimé" à la ligne 1315 de cette même form.


Voilà, @+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Salut Violent_Ken

Merci pour les tests que tu as faits : ils sont pleins d'enseignement pour moi
Je crois avoir compris le problème des disques physiques : dans cette listview il ne faudrait prendre en compte que les disques durs car les clefs USB et les cartes Flash ne peuvent être partitionnées ( dis-moi si je me trompe).Dans ce cas les clefs USB et les cartes Flash peuvent être lues comme des disques logiques comme les lecteurs de disquettes et les partitions logiques des disques durs et apparaissent dans la listview des lecteurs logiques.
Pour les images non valides et les contrôles d'éléments supprimés je vais tenter de trouver le problème ainsi que pour le contrôle Listmft avec sa propriété Row

Merci pour tout : je te recontacterai dès les problèmes solutionnés

A+

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Juste une chose : il semble qu'il soit tout à fait possible de partitionner une clé USB.
http://www.open-files.com/forum/index.php?showtopic=23353

Et le gestionnaire de disque de Windows décrit les supports amovibles type clé USB/lecteur de carte comme étant "Lecteurs de disque" tout comme les disques durs, et par opposition aux "lecteurs d CD-ROM/DVD-ROM".

Donc après tout, il peut sembler logique que ces supports de stockage apparaissent comme des disques physiques.

@+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Bingo j'ai gagné grâce a toi
Pour les disques durs GetDriveType renvoie 3 (lecteur fixe : disque dur) et pour les clefs USB et lecteurs de carte il renvoie 2 (lecteur amovible comme les lecteurs de disquettes)
Dans les disques physiques je ne veux faire apparaitre que les disques durs ce que j'arrive à faire avec DeviceIoControl ( GetDriveType n'agit que sur les partitions logiques)
Je modifie la source de suite : peux-tu tester dans la listview des disques physiques en Introduction si seulement les disques durs apparaissent ?
Concernant le composant Listmft en NTFS peux-tu me dire ce que tes 2 dernières "row" valides t'affichent pour en déduire le nombre d'enregistrements que tu as par cluster ?
Merci bien
ensuite je ne t'enquiquine plus
Merci pour ta patience
GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Alors :

-c'est bon, il n'y a maintenant plus que les disques durs qui apparaissent comme drive physique.

-par contre, il y a l'erreur (elle était peut être déjà là avant, je ne sais pas) "Erreur automation" (-1073741819) à la ligne 2740 du modue1 (Set classWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")) lorsqu'on veut ouvrir un drive physique.

-concernant Listmft, le problème vient, après réflexion, du fait que la boucle de la ligne 2340 de ntfsfrm ne se termine pas après nbclusters-1 si l'on double-clique (ou du moins clique plusieurs fois) sur le drive que l'on veut ouvrir. Ce qui entraine que Listmft se remplit de manière variable en fonction de l'avancement de la boucle For.
Et donc, a priori, le bug cité plus haut n'apparait plus si l'on attend la fin normale de cette boucle for.

Mais il apparait quand même sur certaines cases de Listfmt l'erreur " indice en dehors de la plage" à la ligne offsetattr1& = ptlistatt1&(j%) (ligne 2139).

En tout cas, faut vraiment que je comprenne complètement comment fonctionnent les routines pour pouvoir remplir Listmft et Table. Comme je projette de faire un éditeur hexa qui permette également d'ouvrir les disques durs (en + des fichiers et de la mémoire), il serait très intéressant de pouvoir visualiser directement dans un controle FileView (usercontrol qui ressemble à Explorer) l'arboresence des fichiers existants, et surtout qui n'existent plus (ce que tu fait dans ton programme avec un Treeview et un listview).
Par simple clic sur un fichier effacé, on localiserait son emplacement sur le disque dur, et on récupèrerait, ou du moins en partie, les valeurs hexa qui constituaient le fichier effacé (recovery d'une partie des fichiers effacés)
BREF, tout çà pour dire que, quand je trouverais le temps (j'suis très occupé par mes études), j'étudierais en profondeur ta source pour en tirer des trucs TRES intéressants pour mon programme ^_^
Mias comme j'aime pas repomper mais plutot comprendre et recoder à ma sauce, çà va prendre un long moment ... mais je ne pouvais pas mieux tomber que sur ta source ;)
Tout simplement parfaite !!

Merci beaucoup, @+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Merci bien

Je vais réfléchir aux autres problèmes
Pour restaurer les fichiers effacés je te donne un petit conseil : abandonne l'idée car j'ai essayé ( le projet a déjà 3 ans) et ce n'est pas conseillé
Je t'explique
En NTFS tout est fichier ( pas de zone comme les FAT,pas de directory entry,etc)
Le fichier principal est la MFT ( fichier caché). C'est une base de données avec des enregistrements. Ces enregistrements concernent les fichiers, les répertoires et les metadonnées ( fichiers cachés système de NTFS)
Tu effaces un fichier : son enregistrement existe toujours mais un attribut indique que celui-ci est effacé et peut être utilisé pour un autre fichier.S'il n'est pas utilisé tout de suite un autre fichier peut occuper les clusters du fichier effacé et en essayant de restaurer ton fichier effacé tu n'as pas le bon fichier : c'est l'autre qui a piqué les clusters.Le problème se pose aussi en FAT rassures-toi.
Si tu connais assez bien l'anglais regardes dans les commentaires de ma source : tu trouveras l'URL d'un site expliquant le système NTFS dans les grandes bases

Bonne nuit, bon courage et merci pour tout et vive VBFrance

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Resalut Violent_Ken
Je n'ai pas l'erreur Automation dont tu parles dans ton précédent post
Je l'avais eu au début mais j'ai réussi à la solutionner mais comment ? Je ne sais plus. Si cela me revient je te fais signe
Tchao

GRENIER Alain[8D]
Commenter la réponse de cs_Galain
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Dernière intervention
26 octobre 2010
0
Merci
Violent Ken

Tout à fait, et j'en suis bien conscient.

Je ne veux pas faire un programme qui permette de récupérer intégralement les fichiers perdus, mais plutôt qui permette de récupérer une partie du fichier effacé, c'est à dire de pouvoir localiser et récupérer le contenu du fichier (connaissant sa localisation sur le disque) et de récréer un nouveau fichier en collant les données récupérées.
Bien évidemment, si cet espace a été réalloué à un autre fichier et que celui à réécrit des données dedans, le fichier anciennement effacé sera à moitié mort.
Cà, c'est déjà faisable avec ton programme. Je veux juste ajouter cette fonction à mon éditeur hexa (en un peu plus évoluée) ; c'est très faisable et c'est utilisable facilement (clic dans le FileView sur un fichier supprimé ==> affichage directement dans la zone de la table hexa des valeurs correspondant au fichier, et après l'utilisateur peut récupérer les morceaux de fichiers qu'il désire).

Pour faire un programme de recovery qui restaure les fichiers effacés de manière complète (fichiers non corrompus et réutilisables), je sais que c'est loin de mes compétences, et je me demande même comment c'est possible (si certaines parties du fichiers effacé ont été utilisées par d'autres fichiers existants).

Récupérer la moitié d'un fichier peu être très utile : exemple concret, un fichier *.doc a été supprimé par mégarde, on regarde sa localisation dans le disque, on prie pour qu'un autre fichier ne l'est pas remplacé en trop grande partie, et on récupère au moins une bonne partie du texte (qui ne prend que 10%, voire moins, de la taille d'un fichier *.doc). On peut perde la mise en page, les images...etc., mais on peut récupérer le texte (si on a de la chance et que l'on récupère rapidement ces données avant que quelque chose d'autre soit réécrit au même endroit). Et après, on a tout le loisir de récréer un fichier *.doc vierge et de coller le texte récupéré dedans, de manière à ne pas se retaper toute sa rédaction.

Pour l'erreur automation, l'erreur vient peut être de chez moi ? (puisque çà vient de WMI et que des trucs dans ce genre me sont déjà arrivés avec)
P'têtre qu'avec un reboot çà marchera.

Merci, @+
Commenter la réponse de violent_ken
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Le problème avec Listmft a été solutionné : on bloque les listview dès le premier clic et elles se débloquent lorsque que l'on quitte les feuilles Ntfsfrm, Fatfrm ou Cdromfrm selon le choix de l'utilisateur.
Pour l'erreur "indice en dehors de la plage" à la ligne 2139 :  offsetattr1& = ptlistatt&(j%)  là ce n'est pas de la tarte car cela est sûrement dû à un cas spécial de fichier ou enregistrement NTFS . Je vais chercher
Je te laisse car demain boulot

A + et bon courage
ton éditeur héxadécimal y va être super mon pote !!!
 
GRENIER Alain[8D]
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.