Как получить первый кластер данных каталога в FAT, используя C # (или, по крайней мере, C ++) и Win32API?
-
01-10-2019 - |
Вопрос
Таким образом, у меня есть жирный привод, давайте скажем 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.