GetDiskFreeSpaceEx con disco comprimido
Pregunta
Quiero obtener el espacio libre en un disco comprimido para mostrar a un usuario final. Estoy usando C ++, MFC en Windows 2000 y versiones posteriores. La API de Windows ofrece la función GetDiskFreeSpaceEx()
.
Sin embargo, esta función parece volver al "comprimir" tamaño de los datos. Esto me causa algún problema.
Por ejemplo: - El tamaño del disco es 100 GB - Tamaño de los datos es de 90 GB - Comprimido tamaño de los datos es de 80 GB
El usuario verá que el disco está lleno al 90%, pero en realidad, es sólo el 80% de su capacidad.
Editar
Como Gleb señaló, la función devuelve la buena información.
Así que aquí es la nueva pregunta: ¿Hay una manera de conseguir tanto el tamaño comprimido y la otra sin comprimir
Solución
Creo que tendría que asignar más de todos los archivos, consulta con GetFileSize () y GetCompressedFileSize () y sumarlos. Utilice GetFileAttributes () para saber si un archivo está comprimido o no, en caso de que sólo algunas partes de todo el volumen se comprime, lo que sin duda podría ser el caso.
Hum, por lo que no es un trivial operación. Supongo que debo poner en práctica algún mecanismo para evitar la consulta de todos tamaño de los archivos todo el tiempo. Es decir ... si Tengo un disco duro de 800 GB, podría tomar algún tiempo muy largo para conseguir todo tamaño del archivo.
Es cierto.
Tal vez empezar por un análisis completo (inicio de la aplicación) y poblar la estructura de datos personalizada, por ejemplo, un hash / mapa de nombre de archivo a archivo de datos struct / clase, entonces sondear la unidad con FindFirstChangeNotification () y actualizar su estructura interna en consecuencia.
Es posible que también quiera leer un "cambio de Revistas". Nunca los he utilizado yo así que no saben cómo funcionan, pero valdría la pena echarle un vistazo.
Otros consejos
La función devuelve la cantidad de espacio libre correctamente. Se puede demostrar a través de este sencillo programa.
#include <stdio.h>
#include <windows.h>
void main() {
ULARGE_INTEGER p1, p2, p3;
GetDiskFreeSpaceEx(".", &p1, &p2, &p3);
printf("%llu %llu %llu\n", p1, p2, p3);
}
Después de comprimir un directorio previamente sin comprimir el espacio libre crece.
Entonces, ¿qué estás hablando?