Как получить первый кластер данных каталога в FAT, используя C # (или хотя бы C ++) и Win32API? - PullRequest
1 голос
/ 24 апреля 2010

Итак, у меня есть диск FAT, скажем, H: и каталог 'работа' (полный путь 'H: \ работа'). Мне нужно получить НОМЕР первого кластера этого каталога. Номер первого кластера - это 2-байтовое значение, которое хранится в 26-м и 27-м байтах в папке (что составляет 32 байта).

Допустим, я делаю это с файлом, а не с каталогом. Я могу использовать такой код:

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

И он вернет некоторое число, например, 19 (вполне реально, это единственный файл на диске).

Но мне не нужен файл, мне нужна папка. Поэтому я вставил параметр FILE_FLAG_BACKUP_SEMANTICS для вызова CreateFile ... и не знаю, что делать дальше. Есть ли способ заставить его работать для папки?

MSDN очень ясно по этому вопросу http://msdn.microsoft.com/en-us/library/aa365258(v=VS.85).aspx

Для меня это звучит так: «Невозможно получить номер первого кластера папки». Самое отчаянное, что мой репетитор сказал что-то вроде: «Вы собираетесь получить это или вы не пройдете этот курс». Истинная причина, почему он так уверен, что это возможно, состоит в том, что в течение 10 лет (или, может быть, больше) он получил первый номер кластера папки как HASH адресов папки (и я был настолько глуп, чтобы указать ему это, так что теперь Я не могу сделать это так же)

PS: Это самая глупая задача, которая у меня когда-либо была !!! Это значение в действительности не используется нигде в программе, это всего лишь бессмысленное целое число.

1 Ответ

2 голосов
/ 24 апреля 2010

Так что, если я правильно понимаю, вы хотите прочитать FAT и получить первый кластер каталога на диске?

Если вышеприведенное верно, то лучше открыть том для прямого доступа.
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
См. Раздел «Фистические диски и тома».

После открытия тома вы можете прочитать секторы диска и отсканировать FAT, чтобы найти запись для интересующего вас каталога.

Вот пример использования DeiceIoControl для чтения геометрии диска. http://msdn.microsoft.com/en-us/library/aa363147(VS.85).aspx

...