Программное определение «размера файла на диске» заранее
Вопрос
Мне нужно знать, насколько большим будет данный буфер в памяти в виде файла на диске (USB-накопителе), прежде чем я его напишу.Я знаю, что, если размер не попадает в границу размера блока, он, скорее всего, будет округлен, например.файл размером 1 байт занимает на диске 4096 байт.В настоящее время я делаю это, используя ПолучитьDiskFreeSpace() чтобы определить размер блока диска, а затем использовать это для расчета размера на диске следующим образом:
GetDiskFreeSpace(szDrive, &dwSectorsPerCluster,
&dwBytesPerSector, NULL, NULL);
dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;
if (dwInMemorySize % dwBlockSize != 0)
{
dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
dwSizeOnDisk = dwInMemorySize;
}
Кажется, это работает нормально, НО ПолучитьDiskFreeSpace() согласно MSDN работает только на дисках объемом до 2 ГБ. GetDiskFreeSpaceEx() не возвращает ту же информацию, поэтому мой вопрос: как еще я могу вычислить эту информацию для дисков> 2 ГБ?Есть ли вызов API, который я пропустил?Могу ли я принять некоторые жесткие значения в зависимости от общего размера диска?
Решение
MSDN лишь утверждает, что GetDiskFreeSpace()
функция не может сообщить размеры тома больше 2 ГБ.Он отлично работает для извлечения секторов на кластер и байтов на сектор, я сам использовал его для очень похожего кода ;-)
Но если вам также нужна емкость диска, вам понадобится дополнительный вызов GetDiskFreeSpaceEx()
.
Другие советы
Размер файла на диске — понятие размытое.В NTFS файл состоит из набора элементов данных.В первую очередь вы думаете о «безымянном потоке данных».Это атрибут файла, который, если он небольшой, может быть упакован вместе с другими атрибутами в записи каталога. Видимо, в самой записи каталога можно хранить поток данных размером до 700-800 байт.Следовательно, ваш гипотетический 1-байтовый файл будет размером с файл размером 0 или 700 байт.
Еще одним фактором влияния является сжатие файлов.Это сделает размер на диске потенциально меньшим, чем размер в памяти.
Вы сможете получить эту информацию с помощью функции DeviceIoControl и
ДИСК_ГЕОМЕТРИ_ЭКС.Я думаю, он вернет структуру, содержащую информацию, которую вы ищете.
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)