Программное определение «размера файла на диске» заранее

StackOverflow https://stackoverflow.com/questions/751157

Вопрос

Мне нужно знать, насколько большим будет данный буфер в памяти в виде файла на диске (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

http://msdn.microsoft.com/en-us/library/ms809010.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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top