Pregunta

Necesito saber el tamaño de un búfer en memoria dada será como un (memoria USB) en el disco antes de presentar la escribo. Yo sé que a menos que el tamaño cae en el límite de tamaño de bloque, es probable que se redondean hacia arriba, por ejemplo, un archivo de 1 byte ocupa 4096 bytes en disco. Actualmente estoy haciendo esto utilizando GetDiskFreeSpace () para calcular el tamaño de bloque de disco, a continuación, usando esto para calcular el tamaño en disco de esta manera:

GetDiskFreeSpace(szDrive, &dwSectorsPerCluster, 
                 &dwBytesPerSector, NULL, NULL);

dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;

if (dwInMemorySize % dwBlockSize != 0)
{
    dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
}
else
{
    dwSizeOnDisk = dwInMemorySize;
}

Lo que parece funcionar bien, y GetDiskFreeSpace () sólo funciona en discos de hasta 2 GB acuerdo con MSDN. GetDiskFreeSpaceEx () no devuelve la misma información, por lo que mi pregunta es, ¿cómo puedo calcular esta información para unidades> 2 GB? ¿Hay una llamada a la API que he echado de menos? ¿Puedo suponer algunos valores duros dependiendo del tamaño total del disco?

¿Fue útil?

Solución

MSDN sólo se establece que la función GetDiskFreeSpace() no puede informar tamaños volumen mayor que 2 GB. Funciona bien para la recuperación de sectores por clúster y bytes por sector, he utilizado yo mismo para el código de aspecto muy parecido ;-)

Pero si quieres la capacidad del disco también, se necesita de una llamada adicional a GetDiskFreeSpaceEx().

Otros consejos

El tamaño de un archivo en el disco es un concepto difuso. En NTFS, un archivo se compone de un conjunto de elementos de datos. Usted está pensando primarilty del "flujo de datos sin nombre". Eso es un atributo de un archivo que, si es pequeño, puede ser embalado con los otros atributos en la entrada del directorio. Al parecer , puede almacenar un flujo de datos de hasta 700-800 bytes en la entrada de directorio en sí. Por lo tanto, su hipotética archivo de 1 byte sería tan grande como un archivo de 0 bytes o 700 bytes.

Otra influencia es la compresión de archivos. Esto hará que el tamaño en disco potencialmente más pequeño que el tamaño en memoria.

Usted debe ser capaz de obtener esta información utilizando la función DeviceIoControl y
DISK_GEOMETRY_EX. Se devolverá una estructura que contiene la información que busca Creo

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

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

En 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top