How can I get the size of a folder on SD card in Android?
Just go through all files and sum the length of them:
/** * Return the size of a directory in bytes */private static long dirSize(File dir) { if (dir.exists()) { long result = 0; File[] fileList = dir.listFiles(); if (fileList != null) { for(int i = 0; i < fileList.length; i++) { // Recursive call if it's a directory if(fileList[i].isDirectory()) { result += dirSize(fileList[i]); } else { // Sum the file size in bytes result += fileList[i].length(); } } } return result; // return the file size } return 0;}
NOTE: Function written by hand so it could not compile!
Here's some code that avoids recursion, and also calculates the physical size instead of the logical size:
public static long getFileSize(final File file) { if (file == null || !file.exists()) return 0; if (!file.isDirectory()) return file.length(); final List<File> dirs = new LinkedList<>(); dirs.add(file); long result = 0; while (!dirs.isEmpty()) { final File dir = dirs.remove(0); if (!dir.exists()) continue; final File[] listFiles = dir.listFiles(); if (listFiles == null || listFiles.length == 0) continue; for (final File child : listFiles) { result += child.length(); if (child.isDirectory()) dirs.add(child); } } return result;}
/** * Try this one for better performance * Mehran * Return the size of a directory in bytes **/private static long dirSize(File dir) { long result = 0; Stack<File> dirlist= new Stack<File>(); dirlist.clear(); dirlist.push(dir); while(!dirlist.isEmpty()) { File dirCurrent = dirlist.pop(); File[] fileList = dirCurrent.listFiles(); for(File f: fileList){ if(f.isDirectory()) dirlist.push(f); else result += f.length(); } } return result;}