私は FAT ドライブを持っています。H: とディレクトリ 'work' (フル パス 'H:\work') としましょう。そのディレクトリの最初のクラスターの NUMBER を取得する必要があります。最初のクラスターの番号は 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 directory {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("can't 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 のような数値を返します (私にとっては、これがディスク上の唯一のファイルです)。
しかし、ファイルは必要ありません。フォルダーが必要です。だから私は CreateFile 呼び出しに FILE_FLAG_BACKUP_SEMANTICS パラメータを入れています...そして次に何をすべきかわかりません。フォルダに対して機能させる方法はありますか?
msdn はこの問題について非常に明確ですhttp://msdn.microsoft.com/en-us/library/aa365258(v=VS.85).aspx
「フォルダーの最初のクラスターの数を取得する方法はありません」のように聞こえます。一番絶望的だったのは、私の家庭教師が「これを取得するか、このコースに合格しないか」のようなことを言ったことです。彼がこれが可能であると確信している本当の理由は、10 年 (またはそれ以上) の間、フォルダーの最初のクラスター番号をフォルダーのアドレスの HASH として受け取っていたからです (そして、私はこれを彼に指摘するほど愚かでした。同じようにはできない)
PS: これは私が今まで経験した中で最もばかげた仕事です! この値は実際にはプログラムのどこにも使用されていません。意味のない整数にすぎません。