1

私は 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: これは私が今まで経験した中で最もばかげた仕事です! この値は実際にはプログラムのどこにも使用されていません。意味のない整数にすぎません。

4

1 に答える 1

2

私の理解が正しければ、FAT を読み取り、ディスク上のディレクトリの最初のクラスタを取得したいですか?

上記が正しければ、ボリュームを直接アクセスできるように開いた方がよい場合があります。
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
物理ディスクとボリュームに関するセクションを参照してください。

ボリュームを開いたら、ディスク セクタを読み取り、FAT をスキャンして、目的のディレクトリのエントリを見つけます。

DeiceIoControl を使用してディスク ジオメトリを読み取るサンプルを次に示します。 http://msdn.microsoft.com/en-us/library/aa363147(VS.85).aspx

于 2010-04-24T12:03:17.553 に答える