文件分離

需求:
    根據提供的目錄信息例如/03/2015_11/aaa.doc;
    在本地尋找對應目錄相應的物理文件
    如果這個物理文件存在就把這個文件存儲到03/aaa/doc下
package com.hhx;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Logger;


public class Demo {
	
	private static Logger logger = Logger.getLogger(FileDemo07.class);
	
	public static final String DBDRIVER = "com.mysql.jdbc.Driver";

	public static final String DBURL = "jdbc:mysql://localhost:3306/test";

	public static final String DBUSER = "root";

	public static final String DBPASS = "root";

	public static void main(String[] args) throws SQLException {

		Connection conn = null;
		Statement stmt = null;
		ResultSet result = null;
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		stmt = conn.createStatement();
		result = stmt.executeQuery("select path from table where id > 11096");

		while (result.next()) {// 判斷是否還有下一行
			String totalNameString = result.getString("path");// 獲取數據庫person表中name字段的值

			// String totalNameString="15/2015_05/1431226707756.doc";
			// 在此目錄中找文件
			String baseDIR = "d:/full_test";

			String[] strs = totalNameString.split("/");
			//ID
			String courtId = strs[0];
			// 日期文件夾,文件保存的二級目錄
			String dateTime = strs[1];
			// 找擴展名爲txt的文件
			String fileName = strs[2];

			List resultList = new ArrayList();
			findFiles(baseDIR, fileName, resultList);
			if (resultList.size() == 0) {
				System.out.println("No File Fount.");
				logger.error(fileName+"=======沒找到");
			} else {
				for (int i = 0; i < resultList.size(); i++) {

					// 存在的文件的絕對路徑
					String path = (String) resultList.get(i);
					System.out.println(path);// 顯示查找結果。

					File oldFile = new File(path);// 某路徑下的文件
					String newPath = "D://" + courtId + "/" + dateTime + "//";

					File newFile = new File(newPath);// 新路徑下的文件

					if (!newFile.exists())
						newFile.mkdirs();// 有就用,沒有就新建

					File theLast = new File(newPath + oldFile.getName());

					oldFile.renameTo(theLast);

				}
			}
		}
	}

	/**
	 * 遞歸查找文件
	 * 
	 * @param baseDirName
	 *            查找的文件夾路徑
	 * @param targetFileName
	 *            需要查找的文件名
	 * @param fileList
	 *            查找到的文件集合
	 */
	public static void findFiles(String baseDirName, String targetFileName,
			List fileList) {

		File baseDir = new File(baseDirName); // 創建一個File對象
		if (!baseDir.exists() || !baseDir.isDirectory()) { // 判斷目錄是否存在
			System.out.println("文件查找失敗:" + baseDirName + "不是一個目錄!");
			  logger.error("文件查找失敗:" + baseDirName + "不是一個目錄!");
			  
		}
		String tempName = null;
		// 判斷目錄是否存在
		File tempFile;
		File[] files = baseDir.listFiles();
		for (int i = 0; i < files.length; i++) {
			tempFile = files[i];
			if (tempFile.isDirectory()) {
				findFiles(tempFile.getAbsolutePath(), targetFileName, fileList);
			} else if (tempFile.isFile()) {
				tempName = tempFile.getName();
				if (wildcardMatch(targetFileName, tempName)) {
					// 匹配成功,將文件名添加到結果集
					fileList.add(tempFile.getAbsolutePath());
				}
			}
		}
	}

	/**
	 * 通配符匹配
	 * 
	 * @param pattern
	 *            通配符模式
	 * @param str
	 *            待匹配的字符串
	 * @return 匹配成功則返回true,否則返回false
	 */
	private static boolean wildcardMatch(String pattern, String str) {
		int patternLength = pattern.length();
		int strLength = str.length();
		int strIndex = 0;
		char ch;
		for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {
			ch = pattern.charAt(patternIndex);
			if (ch == '*') {
				// 通配符星號*表示可以匹配任意多個字符
				while (strIndex < strLength) {
					if (wildcardMatch(pattern.substring(patternIndex + 1),
							str.substring(strIndex))) {
						return true;
					}
					strIndex++;
				}
			} else if (ch == '?') {
				// 通配符問號?表示匹配任意一個字符
				strIndex++;
				if (strIndex > strLength) {
					// 表示str中已經沒有字符匹配?了。
					return false;
				}
			} else {
				if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {
					return false;
				}
				strIndex++;
			}
		}
		return (strIndex == strLength);
	}
}


發佈了40 篇原創文章 · 獲贊 29 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章