Como posso recuperar o tamanho da pasta ou arquivo em Java?
java
filesystems
uma vez
fonte
fonte
StatFs
. Ele usa estatísticas do sistema de arquivos e é quase 1000 vezes mais rápido do que os métodos recursivos, que eram inutilizáveis para nossas necessidades. Nossa implementação pode ser encontrada aqui: stackoverflow.com/a/58418639/293280Respostas:
Isso retorna o comprimento do arquivo em bytes ou
0
se o arquivo não existir. Não existe uma maneira embutida de obter o tamanho de uma pasta. Você terá que percorrer a árvore de diretórios recursivamente (usando olistFiles()
método de um objeto de arquivo que representa um diretório) e acumular o tamanho do diretório para você:AVISO : Este método não é suficientemente robusto para uso em produção.
directory.listFiles()
pode retornarnull
e causar aNullPointerException
. Além disso, não considera links simbólicos e possivelmente possui outros modos de falha. Use este método .fonte
NullPointerException
se o diretório for modificado simultaneamente.Usando java-7 nio api, calcular o tamanho da pasta pode ser feito muito mais rápido.
Aqui está um exemplo pronto para execução que é robusto e não lançará uma exceção. Ele registrará os diretórios nos quais não pode entrar ou teve problemas para atravessar. Os links simbólicos são ignorados e a modificação simultânea do diretório não causará mais problemas do que o necessário.
fonte
AtomicLong
vez de apenaslong
?Files
não ter suporte direto!Você precisa
FileUtils#sizeOfDirectory(File)
do commons-io .Observe que você precisará verificar manualmente se o arquivo é um diretório, pois o método lança uma exceção se um não diretório for passado para ele.
AVISO : Este método (a partir de commons-io 2.4) tem um bug e pode lançar
IllegalArgumentException
se o diretório for modificado simultaneamente.fonte
checkDirectory(directory);
verificação. Apenas certifique-se de queFile.listFiles
tem filhos. Refs: FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
se o diretório for modificado durante a iteração.Em Java 8:
Seria mais agradável usar
Files::size
na etapa do mapa, mas lança uma exceção verificada.ATUALIZAÇÃO:
Você também deve estar ciente de que isso pode lançar uma exceção se alguns dos arquivos / pastas não estiverem acessíveis. Veja esta pergunta e outra solução usando Guava .
fonte
fonte
size += getFolderSize(file);
Para Java 8, esta é uma maneira certa de fazer isso:
É importante filtrar todos os diretórios , porque o método de comprimento não tem garantia de ser 0 para diretórios.
Pelo menos esse código fornece as mesmas informações de tamanho que o próprio Windows Explorer.
fonte
Esta é a melhor maneira de obter um tamanho de arquivo geral (funciona para diretório e não diretório):
Edit: Observe que esta provavelmente vai ser uma operação demorada. Não o execute no thread de interface do usuário.
Além disso, aqui (retirado de https://stackoverflow.com/a/5599842/1696171 ) está uma boa maneira de obter uma string legível pelo usuário a partir do longo retornado:
fonte
Se você quiser usar a API Java 8 NIO , o programa a seguir imprimirá o tamanho, em bytes, do diretório em que está localizado.
O
calculateSize
método é universal paraPath
objetos, por isso também funciona para arquivos. Observe que se um arquivo ou diretório estiver inacessível, neste caso o tamanho retornado do objeto de caminho será0
.fonte
File.length()
( Javadoc ).Observe que isso não funciona para diretórios ou não é garantido que funcione.
Para um diretório, o que você deseja? Se é o tamanho total de todos os arquivos debaixo dela, você pode recursivamente anda crianças usando
File.list()
eFile.isDirectory()
e somar seus tamanhos.fonte
O
File
objeto tem umlength
método:fonte
Código fonte:
fonte
para Windows, usando java.io, essa função recursiva é útil.
Isso foi testado e está funcionando corretamente no meu lado.
fonte
Eu testei
du -c <folderpath>
e é 2x mais rápido que o nio.Arquivos ou recursãofonte
fonte
Depois de muita pesquisa e análise de diferentes soluções propostas aqui no StackOverflow. Finalmente decidi escrever minha própria solução. Meu objetivo é ter um mecanismo de exclusão, porque não quero travar se a API não conseguir obter o tamanho da pasta. Este método não é adequado para cenário multithread.
Em primeiro lugar, quero verificar os diretórios válidos ao percorrer a árvore do sistema de arquivos.
Em segundo lugar, não quero que minha chamada recursiva entre em links simbólicos (softlinks) e inclua o tamanho no total agregado.
Finalmente, minha implementação baseada em recursão para buscar o tamanho do diretório especificado. Observe a verificação de nulo para dir.listFiles (). De acordo com o javadoc, existe a possibilidade de esse método retornar nulo.
Um pouco de creme sobre o bolo, a API para obter o tamanho dos arquivos da lista (pode ser todos os arquivos e pastas na raiz).
fonte
no linux se você deseja ordenar os diretórios então du -hs * | sort -h
fonte
Você pode usar
Apache Commons IO
para encontrar o tamanho da pasta facilmente.Se você estiver no maven, adicione a seguinte dependência em seu
pom.xml
arquivo.Se você não for fã do Maven, baixe o jar a seguir e adicione-o ao caminho da classe.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Para obter o tamanho do arquivo via Commons IO,
Também é possível através de
Google Guava
Para Maven, adicione o seguinte:
Se não estiver usando o Maven, adicione o seguinte ao caminho da classe
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Para obter o tamanho do arquivo,
fonte
fonte