Мне нужно знать, насколько большой заданный буфер в памяти будет как файл на диске (usb stick), прежде чем я его напишу. Я знаю, что, если размер не падает на границу размера блока, его вероятность будет округлена, например. 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-вызов, который я пропустил? Могу ли я принять некоторые жесткие значения в зависимости от общего размера диска?
совет: это «округление до следующего кратного». Вы можете использовать block = (MemorySize + (BlockSize-1))% BlockSize; немного короче. – MSalters
Это, конечно, предполагает, что в файловой системе будет нуждаться файл, содержащий N байтов. Конечно, для данных, вероятно, потребуется N байтов, но файл также содержит метаданные, которые необходимо учитывать. Размер метаданных может сильно отличаться от файловой системы. – unwind