Come ottenere il primo gruppo di dati della directory in FAT utilizzando C # (o almeno C ++) e Win32API?

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

Domanda

Così ho un'unità FAT, consente di dire H: e una directory di 'lavoro' (percorso completo 'H: \ lavoro'). Ho bisogno di ottenere il numero del primo gruppo di quella directory. Il numero del primo cluster è 2-byte valore, che viene memorizzato al 26 ° e 27 byte di entrata; cartella (goduto è 32 byte).

Consente di dire che sto facendo con il file, non una directory. Posso utilizzare il codice come questo:

 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);
        }
    }

E tornerà qualche numero, come 19 (abbastanza reale per me, questo è l'unico file sul disco).

Ma non ho bisogno di un file, ho bisogno di una cartella. Quindi sono Puttin FILE_FLAG_BACKUP_SEMANTICS param per CreateFile chiamata ... e non sai cosa fare dopo. C'è un modo per farlo funzionare per una cartella?

MSDN è molto chiaro su questo tema http : //msdn.microsoft.com/en-us/library/aa365258 (v = VS.85) aspx

Sembra a me come: "Non c'è modo è possibile ottenere un numero di primo cluster della cartella". La cosa più disperata è che il mio insegnante ha detto si dovrebbe occupare del tipo "Stai per ottenere questo o è solito passare questo corso". La vera ragione per cui è così sicuro che questo è possibile è perché per 10 anni (o può essere di più) che ha ricevuto prima il numero di cluster della cartella come un hash di addres della cartella (e sono stato così stupido da indicare questo a lui, così ora Non posso farlo allo stesso modo)

PS: Questo è il compito più spupid che abbia mai avuto !!! Questo valore non viene realmente utilizzato anythere in programma, è solo fcking intero inutile.

È stato utile?

Soluzione

Quindi, se ho capito bene, si desidera leggere il grasso e ottenere il primo cluster di una directory sul disco?

Se quanto sopra è corretto, allora potrebbe essere meglio per aprire il volume per l'accesso diretto.
http://msdn.microsoft.com/en-us /library/aa363858(VS.85).aspx
Vedere la sezione sui dischi Phystical e volumi.

Una volta ottenuto il volume aperto è possibile leggere i settori del disco e la scansione della FAT per individuare la voce per la directory che si interessa.

Ecco un esempio di utilizzo di DeiceIoControl a leggere la geometria del disco. http://msdn.microsoft.com/en-us /library/aa363147(VS.85).aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top