事前にプログラムでファイルの「ディスク上のサイズ」を決定する
質問
特定のメモリ内バッファが、ディスク (USB メモリ) ファイルとして書き込まれる前にどのくらいの大きさになるかを知る必要があります。サイズがブロック サイズ境界に収まらない限り、切り上げられる可能性が高いことはわかっています。1 バイトのファイルはディスク上で 4096 バイトを占めます。私は現在これを使用してこれを行っています GetDiskFreeSpace() ディスクのブロック サイズを計算し、これを使用して次のようにディスク上のサイズを計算します。
GetDiskFreeSpace(szDrive, &dwSectorsPerCluster,
&dwBytesPerSector, NULL, NULL);
dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;
if (dwInMemorySize % dwBlockSize != 0)
{
dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
dwSizeOnDisk = dwInMemorySize;
}
それはうまくいくように見えますが、 しかし GetDiskFreeSpace() MSDN によると、最大 2GB のディスクでのみ動作します。 GetDiskFreeSpaceEx() は同じ情報を返さないので、私の質問は、2GBを超えるドライブについてこの情報を他にどのように計算できるかということです。見逃した API 呼び出しはありますか?ディスク全体のサイズに応じて、いくつかのハード値を想定できますか?
解決
MSDN では次のようにのみ述べられています。 GetDiskFreeSpace()
関数はレポートできません ボリュームサイズ 2GBを超える。クラスターごとのセクター数とセクターごとのバイト数を取得するのにうまく機能します。私自身、非常によく似たコードに使用しました ;-)
ただし、ディスク容量も必要な場合は、追加の呼び出しが必要になります。 GetDiskFreeSpaceEx()
.
他のヒント
ディスク上のファイルのサイズは曖昧な概念です。NTFS では、ファイルは一連のデータ要素で構成されます。あなたは主に「名前のないデータ ストリーム」について考えています。これはファイルの属性であり、サイズが小さい場合は、ディレクトリ エントリ内の他の属性と一緒にパックすることができます。 どうやら, 、ディレクトリ エントリ自体に最大 700 ~ 800 バイトのデータ ストリームを保存できます。したがって、仮想の 1 バイト ファイルは、0 バイトまたは 700 バイトのファイルと同じくらいの大きさになります。
もう 1 つの影響は、ファイル圧縮です。これにより、ディスク上のサイズがメモリ内のサイズよりも小さくなる可能性があります。
DeviceIoControl 関数を使用してこの情報を取得できるはずです。
DISK_GEOMETRY_EX。探している情報を含む構造体が返されると思います
http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx
アクションスクリプトで!
var size:Number = 19912;
var sizeOnDisk:Number = size;
var reminder:Number = size % (1024 * 4);
if(reminder>0){
sizeOnDisk = size + ((1024 * 4)- reminder)
}
trace(size)
trace(sizeOnDisk)