Calcular y almacenar en caché los tamaños de las carpetas

Tengo una idea para un programa C # que funciona básicamente como el Explorador de Windows. El objetivo es mostrar todos los archivos y carpetas, y mostrar información específica para cada uno de ellos. Una de las características que planeo es detectar el tamaño de las carpetas, algo que el Explorador no puede.

Mi idea para el algoritmo es acumular los tamaños de todos los archivos en la carpeta específica. Sin embargo, tengo miedo de los problemas de rendimiento. Por ejemplo, para mostrar los tamaños de todas las carpetas de C: tengo que considerar todos los archivos de toda la unidad. Esto probablemente llevará un tiempo y, por lo tanto, el cálculo no se puede realizar cada vez que el usuario cambia a una carpeta diferente o regresa.

Así que me gustaría almacenar en caché algunos de los tamaños. Sin embargo, cuando los archivos cambian, se agregan o eliminan, los datos de la caché quedan obsoletos. Pero no quiero monitorear todos los cambios de archivos mientras el programa no se está ejecutando.

¿Hay alguna forma de saber si la caché está actualizada, por ejemplo, recuperando algún tipo de suma de comprobación que no requiera calcular todos los tamaños nuevamente? ¿Existe otra forma eficiente de memoria y CPU para averiguar si el tamaño de los archivos ha cambiado desde el último cálculo? ¿O hay incluso otra posibilidad?

preguntado el 27 de agosto de 11 a las 22:08

@David No, no lo he visto hasta ahora. Soy consciente de que hay varios programas que pueden hacerlo, pero yo mismo quiero escribir alguna herramienta como esa. :) -

2 Respuestas

El Explorador de Windows tiene el tamaño de carpeta disponible (# archivos, tamaño en disco, etc.) disponible para las propiedades de cualquier disco / carpeta. Ejemplo de propiedades de directorio

En cuanto a escribir un programa, ciertamente puede usar un recurso recurisve DirectoryInfo.EnumerateFiles() para obtener todos los archivos dentro de un disco / carpeta.

En cuanto a la monitorización, puede utilizar el FileSystemWatcher class para monitorear los cambios en cualquier disco / carpeta.

Mantener el caché actualizado será difícil porque:

  1. Dependiendo del tipo de formato de partición [Fat, Fat32, NTFS, etc.], está limitado a lo que cada uno admita.
  2. Cualquier archivo nuevo (fecha de creación> fecha de caché) significa que aún tiene que enumerar todos los archivos para filtrar la lista a archivos nuevos.
  3. Los archivos modificados (fecha de modificación> fecha de caché) tienen el mismo problema.

A menos que use algo MUY específico para el Tipo formateado más allá de lo que proporciona C #, la actualización de un caché después del inicio de la aplicación deberá ocurrir cada vez y ser muy intenso.

Respondido 28 ago 11, 02:08

Gracias por tu respuesta, pero obtener los archivos de una carpeta no es el problema. El monitoreo de los tamaños probablemente no ayudará mucho, ya que pueden cambiar cuando el programa no se está ejecutando. - RolandK

Para NTFS, si pudiera encontrar una manera de usarlo en.wikipedia.org/wiki/NTFS#USN_Journal entonces su caché solo necesita ver cambios dentro del Diario. - Erik Philips

Gracias por tu actualización (+1). Eso es definitivamente algo a considerar, aunque suena bastante complicado. Estoy esperando algunas sugerencias más. Quizás a alguien se le ocurra otra idea. - RolandK

El Explorador de Windows es un programa bastante astuto. Está lleno de trucos diseñados para ocultar el hecho de que cualquier sistema de archivos es extremadamente lento para iterar. El tipo de trucos que conozco:

  • fíngelo. Muestre la jerarquía de carpetas como una vista de árbol y use el glifo [+] para mostrar que una carpeta tiene archivos o directorios dentro de ella. Incluso cuando no es así. Eso es visible, cree un directorio vacío y reinicie su máquina. Tenga en cuenta el glifo [+], haga clic en él y observe que, cuando se le obliga a iterar el subdirectorio, cambia suavemente el glifo [+] a un glifo "nada allí".

  • retrasarlo. Más difícil de ver, necesita un subdirectorio con muchos archivos. Explorer inicia un hilo de fondo que itera el contenido de la carpeta. Una vez que lo descubrió, cambia suavemente el texto de la barra de estado.

  • Dime lo que pasó. Explorer usa mucho ReadDirectoryChangesW (). Envuelto en .NET por la clase FileSystemWatcher. El punto clave es que recibe una notificación que algo cambiado en el subdirectorio que está mirando el usuario. No se requiere sondeo, eso tendría un rendimiento horrible. Regrese a la viñeta dos.

Respondido 28 ago 11, 03:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.