GetDiskFreeSpaceExが間違った空きバイト数を報告する
-
06-07-2019 - |
質問
__int64 i64FreeBytes
unsigned __int64 lpFreeBytesAvailableToCaller,
lpTotalNumberOfBytes,
lpTotalNumberOfFreeBytes; // variables used to obtain
// the free space on the drive
GetDiskFreeSpaceEx (Manager.capDir,
(PULARGE_INTEGER)&lpFreeBytesAvailableToCaller,
(PULARGE_INTEGER)&lpTotalNumberOfBytes,
(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);
i64FreeBytes = lpTotalNumberOfFreeBytes;
_tprintf(_T ("Number of bytes free on the drive:%I64u \n"),
lpTotalNumberOfFreeBytes);
Windows CEコマンドラインアプリケーションであるデータ管理ルーチンで作業しています。上記のコードは、フォルダManager.capdirを含む特定のドライブの空きバイト数を取得する方法を示しています(ディレクトリのフルパス名を含む変数です)。
私の質問は、上記のコード(_tprintfステートメント)によって報告された空きバイト数がドライブの空きバイト数と一致しないことです(ドライブを右クリックして確認します)。
この違いの理由が知りたいですか?
解決
ディスククォータが動作していないシングルユーザーマシンがあります。コードをダイアログベースのMFCアプリケーションに投稿し、実行しました。ただし、" C:\" lpDirectoryNameパラメータとして、システムによって報告されたドライブの空き領域と比較できるようにします。空き容量はフォルダではなくドライブにのみ意味があるため、論理的に思えた。
最初は同様の問題が発生していると考えていましたが、チェックを再実行し(ボタンに結び付けました)、その時点でプロパティダイアログと同じ結果を得ました。ドライブの空き領域はかなり動的な量であるようです-これがシステムドライブである場合、これは驚くことではありません-他のポスターが非常に正確に報告した基準がない場合でも、プロパティと正確に同じ数が表示されない場合がありますダイアログは実行された時点で報告します。
他のヒント
GetDiskFreeSpaceEx 、強調鉱山:
lpFreeBytesAvailable [out、optional]-
受け取る変数へのポインタ 上の空きバイトの総数 ユーザーが利用できるディスク 呼び出しに関連付けられている人 スレッド。
このパラメーターはNULLにすることができます。
ユーザーごとのクォータが使用されている場合、 この値は合計よりも小さい場合があります ディスク上の空きバイト数。
lpTotalNumberOfBytes [out、オプション]-
受け取る変数へのポインタ ディスク上の合計バイト数 あるユーザーが利用できる 呼び出しスレッドに関連付けられています。
このパラメーターはNULLにすることができます。
ユーザーごとのクォータが使用されている場合、 この値は合計よりも小さい場合があります ディスク上のバイト数。
総バイト数を決定するには ディスクまたはボリュームで、使用 IOCTL_DISK_GET_LENGTH_INFO。
つまり、この数はユーザーによって異なります。Explorerから返された値と一致させる場合は、 lpFreeBytesAvailable
を使用します。
1つの可能性が思い浮かびます。おそらく、パーティション分割のために失われたスペースを考慮に入れていない可能性があります(通常、ウィンドウはドライブの最後に8MBをスラックとして残します)。基本的に、物理ドライブに残されているスペースとパーティションによって表される論理スペースには違いがあります。または、ファイルシステム自体のスペースが失われました。
これらが実際に当てはまるかどうかはわかりませんが、調べます。