How can I get a local directory listing as a Json?
So If I provide a folder, I want to see all its subfolders and files in a json tree type object.
Please note: I don’t want just the list with file paths.
Thank you!
Advertisement
Answer
So @CommonsWare put me in the right direction and I was able to do this.
This will create a FileStructure.json
file in ExternalStorageDirectory (/sdcard)
Here’s how:
/** * Creates a json of all files and directories within the given file * @param file the root directory to list * @return true if success, else false */ public static boolean getStructure(Context context, File file) { boolean result = false; JsonWriter writer; try { writer = new JsonWriter(new FileWriter(new File(context.getApplicationContext().getExternalFilesDir(null), "FileStructure.json"))); writer.setIndent(" "); } catch (Exception e) { Log.e(TAG, e.toString()); return result; } try { if(file.exists()) { result = writeRootDir(writer, file); } else { result = false; } writer.close(); } catch (Exception e) { Log.e(TAG, e.toString()); return result; } return true; } /** * writing root directory array and object * @param writer the JsonWriter * @param dir the root dir * @return true if success, else false */ private static boolean writeRootDir(JsonWriter writer, File dir) { boolean result = false; if(!dir.exists() || !dir.isDirectory()) { return result; } try { writer.beginArray(); writer.beginObject(); writer.name(dir.getPath()); result = writeDirectory(writer, dir); writer.endObject(); writer.endArray(); } catch (Exception e) { Log.e(TAG, e.toString()); return result; } return result; } /** * for each directory and file within the root directory * @param writer the JsonWriter * @param dir sub-directory * @return true if success, else false */ private static boolean writeDirectory(JsonWriter writer, File dir) { if(!dir.exists() || !dir.isDirectory()) { return false; } File[] allFiles = dir.listFiles(); List<File> directories = new ArrayList<>(); List<File> files = new ArrayList<>(); for (File subFile : allFiles) { if(!subFile.getName().startsWith(".") && !subFile.getName().startsWith("_") && subFile.isDirectory()) { directories.add(subFile); } } for(File subFile : allFiles) { if(!subFile.getName().startsWith(".") && !subFile.getName().startsWith("_") && !subFile.isDirectory()) { files.add(subFile); } } Collections.sort(directories); Collections.sort(files); try { writer.beginArray(); writer.beginObject(); if(directories.size() > 0) { for(File file : directories) { writer.name(file.getName()); writeDirectory(writer, file); } } writer.endObject(); if(files.size() > 0) { for(File file : files) { writer.value(file.getName()); } } writer.endArray(); } catch (Exception e) { Log.e(TAG, e.toString()); return false; } return true; }