拷貝文件夾及其所有內容,支持單個文件

package question8;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/*
 * 編寫程序,拷貝一個帶內容的文件夾。 
 * 例如:將c:\program files\java 文件夾拷貝到d盤根目錄。
 */
public class CopyFolder
{
	public static void main(String[] args)
	{
		//只要不是錯誤目錄就行,文件夾結尾加不加
		//斜槓都行,沒有區別
		Copy("c:/program files/java", "D:/");
	}
	
	public static void Copy(String srcPath, String desPath)
	{
		File srcFile = new File(srcPath);
		File desFile = new File(desPath);
		//如果給定的源路徑是文件夾
		if(srcFile.isDirectory())
		{
			//如果是文件夾的話,路徑需要增加一個斜槓,
			//用File.getpath可以避免輸入的路徑有斜槓
			//和沒有斜槓導致的一些問題
			srcPath = srcFile.getPath()+File.separator;
			desPath = desFile.getPath()+File.separator;
			
			System.out.println(srcPath + " -> " + desPath);
			
			//遍歷整個文件夾下的所有文件和子文件,
			//並通過遞歸調用自己實現所有文件的複製
			String[] fileList = srcFile.list();
			for (String fileName : fileList)
            {
				Copy(srcPath+fileName, desPath+fileName);
			}
		}
		//如果給定的源路徑是文件
		else if(srcFile.isFile())
		{
			System.out.println(srcPath + " -> " + desPath);
			CopyFile(srcPath, desPath);
		}
		//如果源路徑不合法
		else
		{
			throw new IllegalArgumentException("源文件(夾)不存在");
		}
	}
	
	public static void CopyFile(String srcPath, String desPath)
	{
		try
        {
			File srcFile = new File(srcPath);
			File desFile = new File(desPath);
			
			//僅當源文件爲文件時才複製,目錄無法創建流
			//會拋出異常
			
			if(srcFile.isFile())
			{
				//創建文件以及該路徑裏不存在的目錄
				desFile.getParentFile().mkdirs();
				if(!desFile.exists())
					desFile.createNewFile();
				
				//取得源文件與目標文件的流
				FileInputStream fis = new FileInputStream(srcFile);
				FileOutputStream fos = new FileOutputStream(desFile);
				
				//將源文件寫入目標文件
				while(0 < fis.available())
				{
					fos.write(fis.read());
				}
				
				//關閉輸入輸出流
				fis.close();
				fos.close();
			}
        }
        catch (Exception e)
        {
	        e.printStackTrace();
        }
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章