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

Таким образом, у меня есть диск FAT, позволяет, говорят H: и каталог 'работа' (полный путь 'H:\work'). Я должен получить КОЛИЧЕСТВО первого кластера того каталога. Количество первого кластера является 2-байтовым значением, которое хранится в 26-х и 27-х байтах папки enty (ведьма - 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 лет (или может быть больше) он получил первое кластерное число папки как ХЕШ адреса папки (и я был достаточно глуп указать на это на него, поэтому теперь я не могу сделать этого тот же путь),

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

1
задан DarkWalker 24 April 2010 в 11:37
поделиться

1 ответ

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

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

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

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

2
ответ дан 3 September 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: