接下来的例子说的是Android外部SD卡中的文件拷贝到内部SD卡.
private static final String TAG = "MyTag"; private static final String EXTSD_PATH = "/mnt/extsd/my/dir"; private static final String SDCARD_PATH = "/sdcard/my/dir"; private boolean needReboot = false; /** * 删除目录及目录下的文件 * * @param dir * 要删除的目录的文件路径 * @return 目录删除成功返回true,否则返回false */ public boolean deleteDirectory(String dir) { // 如果dir不以文件分隔符结尾,自动添加文件分隔符 if (!dir.endsWith(File.separator)) dir = dir + File.separator; File dirFile = new File(dir); // 如果dir对应的文件不存在,或者不是一个目录,则退出 if ((!dirFile.exists()) || (!dirFile.isDirectory())) { return false; } boolean flag = true; // 删除文件夹中的所有文件包括子目录 File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) { // 删除子文件 if (files[i].isFile()) { flag = _deleteFile(files[i].getAbsolutePath()); if (!flag) break; } // 删除子目录 else if (files[i].isDirectory()) { flag = deleteDirectory(files[i] .getAbsolutePath()); if (!flag) break; } } if (!flag) { Log.i(TAG, String.format("Delete %s failed!", dir)); return false; } Log.i(TAG, String.format("Empty %s success", dir)); return true; } /** * 删除单个文件 * * @param fileName * 要删除的文件的文件名 * @return 单个文件删除成功返回true,否则返回false */ public boolean _deleteFile(String fileName) { File file = new File(fileName); // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 if (file.exists() && file.isFile()) { if (file.delete()) { Log.i(TAG, String.format("Delete %s success", fileName)); return true; } else { Log.i(TAG, String.format("Delete %s failed!", fileName)); return false; } } return false; } private boolean sameFile(File srcFile, File destFile) throws IOException{ FileInputStream src = new FileInputStream(srcFile); FileInputStream dest = new FileInputStream(destFile); int destLen = 0, srcLen = 0; byte[] srcBuf = new byte[1024]; byte[] destBuf = new byte[1024]; int i; boolean same = true; while ((srcLen = src.read(srcBuf)) != -1) { destLen = dest.read(destBuf); if (srcLen != destLen) { Log.e(TAG, String.format("lens: %d != %d", srcLen, destLen)); same = false; break; } for (i = 0; i < srcLen; i++) { if (srcBuf[i] != destBuf[i]) { Log.e(TAG, String.format("value: %02X != %02X", srcBuf[i], destBuf[i])); same = false; break; } } } if ((srcLen != -1)) { Log.e(TAG, String.format("error len: %d", srcLen)); } dest.close(); dest.close(); return same; } /** * 拷贝一个文件,srcFile源文件,destFile目标文件 * * @throws IOException */ public boolean copyFileTo(File srcFile, File destFile) throws IOException { if (srcFile.isDirectory() || destFile.isDirectory()) return false;// 判断是否是文件 if (!srcFile.getAbsolutePath().contains(".txt") && !srcFile.getAbsolutePath().contains(".TXT") && !srcFile.getAbsolutePath().contains(".ini") && !srcFile.getAbsolutePath().contains(".INI")) { return true; } if (destFile.exists()) { if (sameFile(srcFile, destFile)) { Log.i(TAG, String.format("same file %s", srcFile.getName())); return true; } } else { Log.i(TAG, String.format("%s not exist", destFile.getName())); } deleteDirectory(destFile.getParent()); destFile.createNewFile(); FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); int readLen ; byte[] buf = new byte[1024]; while ((readLen = fis.read(buf)) != -1) { fos.write(buf, 0, readLen); } fos.flush(); fos.close(); fis.close(); if (sameFile(srcFile, destFile)) { needReboot = true; Log.i(TAG, String.format("copy file %s to %s success", srcFile.getAbsolutePath(), destFile.getAbsolutePath())); } else { Log.i(TAG, String.format("copy file %s to %s failed!", srcFile.getAbsolutePath(), destFile.getAbsolutePath())); } return true; } /** * 拷贝目录下的所有文件到指定目录 * * @param srcDir * @param destDir * @return * @throws IOException */ public boolean copyFilesTo(File srcDir, File destDir) throws IOException { if (!destDir.exists()) { destDir.mkdirs(); if (!destDir.exists()) { Log.i(TAG, String.format("create dir %s failed!", destDir.getName())); return false;// 判断目标目录是否存在 } } if (!srcDir.isDirectory() || !destDir.isDirectory()) return false;// 判断是否是目录 File[] srcFiles = srcDir.listFiles(); for (int i = 0; i < srcFiles.length; i++) { if (srcFiles[i].isFile()) { // 获得目标文件 File destFile = new File(destDir.getPath() + "//" + srcFiles[i].getName()); copyFileTo(srcFiles[i], destFile); } else if (srcFiles[i].isDirectory()) { File theDestDir = new File(destDir.getPath() + "//" + srcFiles[i].getName()); copyFilesTo(srcFiles[i], theDestDir); } } return true; } public boolean initSdcardTestDir() { File dirFile = new File(SDCARD_PATH); File extsdFile = new File(EXTSD_PATH); if (dirFile.exists() && !dirFile.isDirectory()) { _deleteFile(SDCARD_PATH); Log.i(TAG, "sdcard test Dir invalid, delete"); } if (!Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { Log.i(TAG, "External SD not mounted!"); return false; } if (!extsdFile.exists()) { Log.i(TAG, "Test Dir not exist!"); return false; } try { copyFilesTo(extsdFile, dirFile); } catch (IOException e) { e.printStackTrace(); } return true; } private static final String TAG = "MyTag"; private static final String EXTSD_PATH = "/mnt/extsd/my/dir"; private static final String SDCARD_PATH = "/sdcard/my/dir"; private boolean needReboot = false; /** * 删除目录及目录下的文件 * * @param dir * 要删除的目录的文件路径 * @return 目录删除成功返回true,否则返回false */ public boolean deleteDirectory(String dir) { // 如果dir不以文件分隔符结尾,自动添加文件分隔符 if (!dir.endsWith(File.separator)) dir = dir + File.separator; File dirFile = new File(dir); // 如果dir对应的文件不存在,或者不是一个目录,则退出 if ((!dirFile.exists()) || (!dirFile.isDirectory())) { return false; } boolean flag = true; // 删除文件夹中的所有文件包括子目录 File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) { // 删除子文件 if (files[i].isFile()) { flag = _deleteFile(files[i].getAbsolutePath()); if (!flag) break; } // 删除子目录 else if (files[i].isDirectory()) { flag = deleteDirectory(files[i] .getAbsolutePath()); if (!flag) break; } } if (!flag) { Log.i(TAG, String.format("Delete %s failed!", dir)); return false; } Log.i(TAG, String.format("Empty %s success", dir)); return true; } /** * 删除单个文件 * * @param fileName * 要删除的文件的文件名 * @return 单个文件删除成功返回true,否则返回false */ public boolean _deleteFile(String fileName) { File file = new File(fileName); // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 if (file.exists() && file.isFile()) { if (file.delete()) { Log.i(TAG, String.format("Delete %s success", fileName)); return true; } else { Log.i(TAG, String.format("Delete %s failed!", fileName)); return false; } } return false; } private boolean sameFile(File srcFile, File destFile) throws IOException{ FileInputStream src = new FileInputStream(srcFile); FileInputStream dest = new FileInputStream(destFile); int destLen = 0, srcLen = 0; byte[] srcBuf = new byte[1024]; byte[] destBuf = new byte[1024]; int i; boolean same = true; while ((srcLen = src.read(srcBuf)) != -1) { destLen = dest.read(destBuf); if (srcLen != destLen) { Log.e(TAG, String.format("lens: %d != %d", srcLen, destLen)); same = false; break; } for (i = 0; i < srcLen; i++) { if (srcBuf[i] != destBuf[i]) { Log.e(TAG, String.format("value: %02X != %02X", srcBuf[i], destBuf[i])); same = false; break; } } } if ((srcLen != -1)) { Log.e(TAG, String.format("error len: %d", srcLen)); } dest.close(); dest.close(); return same; } /** * 拷贝一个文件,srcFile源文件,destFile目标文件 * * @throws IOException */ public boolean copyFileTo(File srcFile, File destFile) throws IOException { if (srcFile.isDirectory() || destFile.isDirectory()) return false;// 判断是否是文件 if (!srcFile.getAbsolutePath().contains(".txt") && !srcFile.getAbsolutePath().contains(".TXT") && !srcFile.getAbsolutePath().contains(".ini") && !srcFile.getAbsolutePath().contains(".INI")) { return true; } if (destFile.exists()) { if (sameFile(srcFile, destFile)) { Log.i(TAG, String.format("same file %s", srcFile.getName())); return true; } } else { Log.i(TAG, String.format("%s not exist", destFile.getName())); } deleteDirectory(destFile.getParent()); destFile.createNewFile(); FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); int readLen ; byte[] buf = new byte[1024]; while ((readLen = fis.read(buf)) != -1) { fos.write(buf, 0, readLen); } fos.flush(); fos.close(); fis.close(); if (sameFile(srcFile, destFile)) { needReboot = true; Log.i(TAG, String.format("copy file %s to %s success", srcFile.getAbsolutePath(), destFile.getAbsolutePath())); } else { Log.i(TAG, String.format("copy file %s to %s failed!", srcFile.getAbsolutePath(), destFile.getAbsolutePath())); } return true; } /** * 拷贝目录下的所有文件到指定目录 * * @param srcDir * @param destDir * @return * @throws IOException */ public boolean copyFilesTo(File srcDir, File destDir) throws IOException { if (!destDir.exists()) { destDir.mkdirs(); if (!destDir.exists()) { Log.i(TAG, String.format("create dir %s failed!", destDir.getName())); return false;// 判断目标目录是否存在 } } if (!srcDir.isDirectory() || !destDir.isDirectory()) return false;// 判断是否是目录 File[] srcFiles = srcDir.listFiles(); for (int i = 0; i < srcFiles.length; i++) { if (srcFiles[i].isFile()) { // 获得目标文件 File destFile = new File(destDir.getPath() + "//" + srcFiles[i].getName()); copyFileTo(srcFiles[i], destFile); } else if (srcFiles[i].isDirectory()) { File theDestDir = new File(destDir.getPath() + "//" + srcFiles[i].getName()); copyFilesTo(srcFiles[i], theDestDir); } } return true; } public boolean initSdcardTestDir() { File dirFile = new File(SDCARD_PATH); File extsdFile = new File(EXTSD_PATH); if (dirFile.exists() && !dirFile.isDirectory()) { _deleteFile(SDCARD_PATH); Log.i(TAG, "sdcard test Dir invalid, delete"); } if (!Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { Log.i(TAG, "External SD not mounted!"); return false; } if (!extsdFile.exists()) { Log.i(TAG, "Test Dir not exist!"); return false; } try { copyFilesTo(extsdFile, dirFile); } catch (IOException e) { e.printStackTrace(); } return true; }