Comment obtenir le premier groupe de données de l'annuaire en FAT en utilisant C # (ou au moins C ++) et Win32API?

StackOverflow https://stackoverflow.com/questions/2704277

Question

J'ai un lecteur FAT, permet de dire H: et un répertoire 'travail' (chemin complet 'H: \ work'). Je dois obtenir le numéro du premier groupe de ce répertoire. Le numéro de la première grappe est de 2 octets valeur, qui est stockée dans les 26 et 27 octets du dossier enty (wich est de 32 octets).

Disons que je fais avec le fichier, pas un répertoire. Je peux utiliser le code comme ceci:

 static public string GetDirectoryPtr(string dir)
    {

        IntPtr ptr = CreateFile(@"H:\Work\dover.docx",
            GENERIC_READ,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            IntPtr.Zero,
            OPEN_EXISTING,
            0,//FILE_FLAG_BACKUP_SEMANTICS, 
            IntPtr.Zero);
        try
        {
            const uint bytesToRead = 2;
            byte[] readbuffer = new byte[bytesToRead];
            if (ptr.ToInt32() == -1) return String.Format("Error: cannot open direcotory {0}", dir);
            if (SetFilePointer(ptr, 26, 0, 0) == -1) return String.Format("Error: unable to set file pointer on file {0}", ptr);

            uint read = 0; // real count of read bytes
            if (!ReadFile(ptr, readbuffer, bytesToRead, out read, 0)) return String.Format("cant read from file {0}. Error #{1}", ptr, Marshal.GetLastWin32Error());                
            int result = readbuffer[0] + 16 * 16 * readbuffer[1];
            return result.ToString();//ASCIIEncoding.ASCII.GetString(readbuffer);

        }
        finally
        {
            CloseHandle(ptr);
        }
    }

Et il retourne un nombre, comme 19 (tout à fait réel pour moi, c'est le seul fichier sur le disque).

Mais j'ai besoin d'un fichier, j'ai besoin d'un dossier. Donc, je suis Puttin FILE_FLAG_BACKUP_SEMANTICS pour l'appel CreateFile param ... et ne savent pas quoi faire. Est-il possible de le faire fonctionner pour un dossier?

msdn est très clair sur cette question http : //msdn.microsoft.com/en-us/library/aa365258 (v = VS.85) .aspx

Il me semble: « Il n'y a aucun moyen que vous pouvez obtenir un certain nombre de premier groupe du dossier ». La chose la plus désespérée est que mon tuteur dit smth comme « Vous allez obtenir ceci ou vous ne serez passer ce cap ». La vraie raison pour laquelle il est si sûr que cela est possible parce que pendant 10 ans (ou peut-être plus) il a reçu le premier numéro de groupe du dossier en tant que HASH les addres de dossier (et je suis assez stupide pour souligner ce point à lui, maintenant Je ne peux pas le faire de la même façon)

PS: Ceci est la tâche la plus spupid que j'ai jamais eu !!! Cette valeur est pas vraiment utilisé anythere dans le programme, il est seulement fcking entier inutile.

Était-ce utile?

La solution

Donc, si je comprends bien, vous voulez lire le FAT et obtenir le premier groupe d'un répertoire sur le disque?

Si ce qui précède est correct, alors il pourrait être préférable d'ouvrir le volume pour un accès direct.
http://msdn.microsoft.com/en-us /library/aa363858(VS.85).aspx
Voir la section sur les disques et volumes Phystical.

Une fois que vous avez le volume ouvert, vous pouvez lire les secteurs du disque et de scanner le FAT pour localiser l'entrée pour le répertoire qui vous intéresse.

Voici un exemple d'utilisation DeiceIoControl pour lire la géométrie du disque. http://msdn.microsoft.com/en-us /library/aa363147(VS.85).aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top