Mega Code Archive

 
Categories / Android / File
 

Static methods used for common file operations on Android

/*  * Copyright (C) 2009 University of Washington  *   * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except  * in compliance with the License. You may obtain a copy of the License at  *   * http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software distributed under the License  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express  * or implied. See the License for the specific language governing permissions and limitations under  * the License.  */ //package org.odk.collect.android.utilities; import android.os.Environment; import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; /**  * Static methods used for common file operations.  *   * @author Carl Hartung (carlhartung@gmail.com)  */ public class FileUtils {     private final static String t = "FileUtils";     // Used to validate and display valid form names.     public static final String VALID_FILENAME = "[ _\\-A-Za-z0-9]*.x[ht]*ml";     // Storage paths     public static final String FORMS_PATH = Environment.getExternalStorageDirectory() + "/odk/forms/";     public static final String INSTANCES_PATH = Environment.getExternalStorageDirectory() + "/odk/instances/";     public static final String CACHE_PATH = Environment.getExternalStorageDirectory() + "/odk/.cache/";     public static final String TMPFILE_PATH = CACHE_PATH + "tmp.jpg";          public static ArrayList<String> getValidFormsAsArrayList(String path) {         ArrayList<String> formPaths = new ArrayList<String>();         File dir = new File(path);         if (!storageReady()) {             return null;         }         if (!dir.exists()) {             if (!createFolder(path)) {                 return null;             }         }         File[] dirs = dir.listFiles();         for (int i = 0; i < dirs.length; i++) {           // skip all the directories           if (dirs[i].isDirectory())             continue;                        String formName = dirs[i].getName();           formPaths.add(dirs[i].getAbsolutePath());         }         return formPaths;     }     public static ArrayList<String> getFoldersAsArrayList(String path) {         ArrayList<String> mFolderList = new ArrayList<String>();         File root = new File(path);         if (!storageReady()) {             return null;         }         if (!root.exists()) {             if (!createFolder(path)) {                 return null;             }         }         if (root.isDirectory()) {             File[] children = root.listFiles();             for (File child : children) {                 boolean directory = child.isDirectory();                 if (directory) {                     mFolderList.add(child.getAbsolutePath());                 }             }         }         return mFolderList;     }     public static boolean deleteFolder(String path) {         // not recursive         if (path != null && storageReady()) {             File dir = new File(path);             if (dir.exists() && dir.isDirectory()) {                 File[] files = dir.listFiles();                 for (File file : files) {                     if (!file.delete()) {                         Log.i(t, "Failed to delete " + file);                     }                 }             }             return dir.delete();         } else {             return false;         }     }     public static boolean createFolder(String path) {         if (storageReady()) {             boolean made = true;             File dir = new File(path);             if (!dir.exists()) {                 made = dir.mkdirs();             }             return made;         } else {             return false;         }     }     public static boolean deleteFile(String path) {         if (storageReady()) {             File f = new File(path);             return f.delete();         } else {             return false;         }     }     public static byte[] getFileAsBytes(File file) {         byte[] bytes = null;         InputStream is = null;         try {             is = new FileInputStream(file);             // Get the size of the file             long length = file.length();             if (length > Integer.MAX_VALUE) {                 Log.e(t, "File " + file.getName() + "is too large");                 return null;             }             // Create the byte array to hold the data             bytes = new byte[(int) length];             // Read in the bytes             int offset = 0;             int read = 0;             try {                 while (offset < bytes.length && read >= 0) {                     read = is.read(bytes, offset, bytes.length - offset);                     offset += read;                 }             } catch (IOException e) {                 Log.e(t, "Cannot read " + file.getName());                 e.printStackTrace();                 return null;             }             // Ensure all the bytes have been read in             if (offset < bytes.length) {                 try {                     throw new IOException("Could not completely read file " + file.getName());                 } catch (IOException e) {                     e.printStackTrace();                     return null;                 }             }             return bytes;         } catch (FileNotFoundException e) {             Log.e(t, "Cannot find " + file.getName());             e.printStackTrace();             return null;         } finally {             // Close the input stream             try {                 is.close();             } catch (IOException e) {                 Log.e(t, "Cannot close input stream for " + file.getName());                 e.printStackTrace();                 return null;             }         }     }     public static boolean storageReady() {         String cardstatus = Environment.getExternalStorageState();         if (cardstatus.equals(Environment.MEDIA_REMOVED)                 || cardstatus.equals(Environment.MEDIA_UNMOUNTABLE)                 || cardstatus.equals(Environment.MEDIA_UNMOUNTED)                 || cardstatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {             return false;         } else {             return true;         }     }     public static String getMd5Hash(File file) {         try {             // CTS (6/15/2010) : stream file through digest instead of handing it the byte[]             MessageDigest md = MessageDigest.getInstance("MD5");             int chunkSize = 256;             byte[] chunk = new byte[chunkSize];             // Get the size of the file             long lLength = file.length();             if (lLength > Integer.MAX_VALUE) {                 Log.e(t, "File " + file.getName() + "is too large");                 return null;             }             int length = (int) lLength;             InputStream is = null;             is = new FileInputStream(file);             int l = 0;             for (l = 0; l + chunkSize < length; l += chunkSize) {                 is.read(chunk, 0, chunkSize);                 md.update(chunk, 0, chunkSize);             }             int remaining = length - l;             if (remaining > 0) {                 is.read(chunk, 0, remaining);                 md.update(chunk, 0, remaining);             }             byte[] messageDigest = md.digest();             BigInteger number = new BigInteger(1, messageDigest);             String md5 = number.toString(16);             while (md5.length() < 32)                 md5 = "0" + md5;             is.close();             return md5;         } catch (NoSuchAlgorithmException e) {             Log.e("MD5", e.getMessage());             return null;         } catch (FileNotFoundException e) {             Log.e("No Cache File", e.getMessage());             return null;         } catch (IOException e) {             Log.e("Problem reading from file", e.getMessage());             return null;         }               } }