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

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

Вопрос

Таким образом, у меня есть жирный привод, давайте скажем H: и каталог «работа» (полный путь h: Raction '). Мне нужно получить номер первого кластера этого каталога. Количество первого кластера - это значение 2 байта, которое хранится в 26-й и 27 байта байта в папке (Wicch - 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 (вполне реально для меня, это единственный файл на диске).

Но мне не нужен файл, мне нужна папка. Так что я Puttin file_flag_backup_semantics paral для createfile Call ... и не знаю, что делать дальше. Есть ли способ получить его работать на папку?

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

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

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

Это было полезно?

Решение

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

Если вышеперечисленное является правильным, то может быть лучше открыть громкость для прямого доступа.
http://msdn.microsoft.com/en-us/library/aaa363858(vs.85).aspx.
Смотрите раздел на фистических дисках и объемах.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top