JavaUtils - 檔案操作

襲冷發表於2014-03-31
public class FileUtils {
	/**
	 * 刪除指定的目錄或檔案
	 * 
	 * @param path
	 *            要刪除的目錄或檔案
	 * @return 刪除成功返回 true,否則返回 false。
	 */
	public static boolean deleteFolder(String path) {
		boolean flag = false;
		File file = new File(path);
		// 判斷目錄或檔案是否存在
		if (file.exists()) {
			// 判斷是否為檔案
			if (file.isFile()) { // 為檔案時呼叫刪除檔案方法
				return deleteFile(path);
			} else { // 為目錄時呼叫刪除目錄方法
				return deleteDirectory(path);
			}
		} else {
			return flag;
		}
	}

	/**
	 * 刪除單個檔案
	 * 
	 * @param path
	 *            要刪除檔案的檔名
	 * @return 單個檔案刪除成功返回true,否則返回false
	 */
	public static boolean deleteFile(String path) {
		boolean flag = false;
		File file = new File(path);
		// 路徑為檔案且不為空則進行刪除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 刪除目錄以及目錄下的檔案
	 * 
	 * @param path
	 *            要刪除目錄的檔案路徑
	 * 
	 * @return 目錄刪除成功返回true,否則返回false
	 */
	public static boolean deleteDirectory(String path) {
		// 如果path不以檔案分隔符結尾,自動新增檔案分隔符
		if (!path.endsWith(File.separator)) {
			path = path + File.separator;
		}
		File dirFile = new File(path);
		// 如果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 {
				// 刪除子目錄的遞迴呼叫,迴圈刪除
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;
			}
		}
		if (!flag)
			return false;
		// 刪除當前目錄
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 複製目錄
	 * 
	 * @param oldPath
	 *            需要複製的目錄
	 * @param newPath
	 *            目標目錄
	 */
	public static boolean copyDirectory(String oldPath, String newPath) {
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			(new File(newPath)).mkdirs(); // 如果目錄不存在 則建立新目錄
			File a = new File(oldPath);
			String[] file = a.list();
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}
				if (temp.isFile()) {
					br = new BufferedReader(new InputStreamReader(new FileInputStream(
							temp)));
					bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
							newPath + File.separator
									+ (temp.getName()).toString())));
					String data;
					while ((data = br.readLine()) != null) {
						bw.write(data, 0, data.length());
					}
					bw.flush();
				}
				if (temp.isDirectory()) {// 如果是子資料夾
					copyDirectory(oldPath + File.separator + file[i], newPath
							+ File.separator + file[i]);
				}
			}
			return true;
		} catch (Exception e1) {
			System.out.println("複製整個資料夾內容操作出錯");
			e1.printStackTrace();
			return false;
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (bw != null) {
					bw.close();
				}
			} catch (Exception e2) {
			}
		}
	}

	/**
	 * 
	 * 測試方法
	 * 
	 */
	public static void main(String[] args) {
		FileUtils.deleteFolder("E:/testFolder");
	}
}