Программное определение размера файла на диске заранее - PullRequest
2 голосов
/ 15 апреля 2009

Мне нужно знать, насколько большим будет данный буфер в памяти в виде файла на диске (флешка), прежде чем я запишу его. Я знаю, что если размер не попадает на границу размера блока, он может округляться, например, 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 () работает только на дисках объемом до 2 ГБ в соответствии с MSDN. GetDiskFreeSpaceEx () не возвращает ту же информацию, поэтому мой вопрос: как еще можно рассчитать эту информацию для накопителей> 2 ГБ? Я пропустил вызов API? Могу ли я принять некоторые жесткие значения в зависимости от общего размера диска?

Ответы [ 4 ]

3 голосов
/ 15 апреля 2009

MSDN только указывает, что функция GetDiskFreeSpace() не может сообщить размеры тома больше 2 ГБ. Он отлично работает для извлечения секторов на кластер и байтов на сектор, я сам использовал его для очень похожего кода ;-)

Но если вам нужна емкость диска, вам понадобится дополнительный вызов GetDiskFreeSpaceEx().

3 голосов
/ 15 апреля 2009

Размер файла на диске - нечеткое понятие. В NTFS файл состоит из набора элементов данных. Вы в первую очередь думаете о «неназванном потоке данных». Это атрибут файла, который, если он маленький, может быть упакован с другими атрибутами в записи каталога. Очевидно, , вы можете хранить поток данных размером до 700-800 байт в самой записи каталога. Следовательно, ваш гипотетический 1-байтовый файл будет размером с 0-байтный или 700-байтовый файл.

Другое влияние - сжатие файлов. Это сделает размер на диске потенциально меньшим, чем размер в памяти.

1 голос
/ 15 апреля 2009

Вы должны быть в состоянии получить эту информацию, используя функцию DeviceIoControl и
DISK_GEOMETRY_EX. Он вернет структуру, которая содержит информацию, которую вы ищете, я думаю

http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx

http://msdn.microsoft.com/en-us/library/ms809010.aspx

0 голосов
/ 11 июня 2010

В ActionScript!

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)
...