¿Cómo puedo recuperar el tamaño de la carpeta o el archivo en Java?
java
filesystems
oneat
fuente
fuente

StatFs. Utiliza estadísticas del sistema de archivos y es casi 1000 veces más rápido que los métodos recursivos, que no se podían utilizar para nuestras necesidades. Nuestra implementación se puede encontrar aquí: stackoverflow.com/a/58418639/293280Respuestas:
Esto devuelve la longitud del archivo en bytes o
0si el archivo no existe. No hay una forma incorporada de obtener el tamaño de una carpeta, tendrá que recorrer el árbol de directorios de forma recursiva (utilizando ellistFiles()método de un objeto de archivo que representa un directorio) y acumular el tamaño del directorio por sí mismo:ADVERTENCIA : Este método no es lo suficientemente sólido para su uso en producción.
directory.listFiles()puede volvernully causar unNullPointerException. Además, no considera enlaces simbólicos y posiblemente tenga otros modos de falla. Utilice este método .fuente
NullPointerExceptionsi el directorio se modifica al mismo tiempo.Usando java-7 nio api, calcular el tamaño de la carpeta se puede hacer mucho más rápido.
Aquí hay un ejemplo listo para ejecutar que es robusto y no generará una excepción. Registrará los directorios en los que no puede ingresar o tuvo problemas para recorrer. Los enlaces simbólicos se ignoran y la modificación simultánea del directorio no causará más problemas de los necesarios.
fuente
AtomicLonglugar de sololong?Filesque no lo admita directamente!Necesitas
FileUtils#sizeOfDirectory(File)de commons-io .Tenga en cuenta que deberá verificar manualmente si el archivo es un directorio, ya que el método genera una excepción si se le pasa un no directorio.
ADVERTENCIA : Este método (a partir de commons-io 2.4) tiene un error y puede producirse
IllegalArgumentExceptionsi el directorio se modifica al mismo tiempo.fuente
checkDirectory(directory);cheque. Solo asegúrate de queFile.listFilestenga hijos. Refs: FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentExceptionsi el directorio se modifica mientras está iterando.En Java 8:
Sería mejor usarlo
Files::sizeen el paso del mapa, pero arroja una excepción marcada.ACTUALIZACIÓN:
también debe tener en cuenta que esto puede generar una excepción si no se puede acceder a algunos de los archivos / carpetas. Vea esta pregunta y otra solución usando Guava .
fuente
fuente
size += getFolderSize(file);Para Java 8, esta es una forma correcta de hacerlo:
Es importante filtrar todos los directorios , porque no se garantiza que el método de longitud sea 0 para los directorios.
Al menos este código ofrece la misma información de tamaño que el propio Explorador de Windows.
fuente
Esta es la mejor manera de obtener el tamaño de un archivo general (funciona para directorio y no directorio):
Editar: tenga en cuenta que probablemente esta operación llevará mucho tiempo. No lo ejecutes en el hilo de la interfaz de usuario.
Además, aquí (tomado de https://stackoverflow.com/a/5599842/1696171 ) hay una buena manera de obtener una cadena legible por el usuario de la devolución larga:
fuente
Si desea utilizar Java 8 NIO API, el siguiente programa imprimirá el tamaño, en bytes, del directorio en el que se encuentra.
El
calculateSizemétodo es universal paraPathobjetos, por lo que también funciona para archivos. Tenga en cuenta que si un archivo o directorio es inaccesible, en este caso, el tamaño devuelto del objeto de ruta será0.fuente
File.length()( Javadoc ).Tenga en cuenta que esto no funciona para directorios o no se garantiza que funcione.
Para un directorio, ¿qué quieres? Si es el tamaño total de todos los archivos debajo de él, puede caminar recursivamente a los niños usando
File.list()yFile.isDirectory()y sumar sus tamaños.fuente
El
Fileobjeto tiene unlengthmétodo:fuente
Código fuente:
fuente
para Windows, usando java.io esta función reccursiva es útil.
Esto está probado y funciona correctamente por mi parte.
fuente
He probado
du -c <folderpath>y es 2 veces más rápido que nio.Files o recursividadfuente
fuente
Después de mucha investigación y análisis de las diferentes soluciones propuestas aquí en StackOverflow. Finalmente decidí escribir mi propia solución. Mi propósito es tener un mecanismo de no tirar porque no quiero fallar si la API no puede recuperar el tamaño de la carpeta. Este método no es adecuado para escenarios de subprocesos múltiples.
En primer lugar, quiero comprobar los directorios válidos mientras recorro el árbol del sistema de archivos.
En segundo lugar, no quiero que mi llamada recursiva entre en enlaces simbólicos (enlaces suaves) e incluya el tamaño en total agregado.
Finalmente, mi implementación basada en recursividad para obtener el tamaño del directorio especificado. Observe la comprobación nula de dir.listFiles (). Según javadoc, existe la posibilidad de que este método pueda devolver un valor nulo.
Un poco de crema en el pastel, la API para obtener el tamaño de los archivos de la lista (pueden ser todos los archivos y carpetas en la raíz).
fuente
en linux si desea ordenar directorios entonces du -hs * | sort -h
fuente
Puede utilizar
Apache Commons IOpara encontrar el tamaño de la carpeta fácilmente.Si está en maven, agregue la siguiente dependencia en su
pom.xmlarchivo.Si no eres fanático de Maven, descarga el siguiente jar y agrégalo a la ruta de clases.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Para obtener el tamaño del archivo a través de Commons IO,
También se puede lograr a través de
Google GuavaPara Maven, agregue lo siguiente:
Si no usa Maven, agregue lo siguiente a la ruta de clases
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Para obtener el tamaño del archivo,
fuente
fuente