Итак, у меня есть диск 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: Это самая глупая задача, которая у меня когда-либо была !!! Это значение в действительности не используется нигде в программе, это всего лишь бессмысленное целое число.