package com.file;

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

/*
 * Java实现文件复制、剪切、删除操作
 * 文件指文件或文件夹
 * 文件分割符统一用"//"
 */

public class FileOperateDemo {

	/**
	 * 复制文件或文件夹
	 * 
	 * @param srcPath
	 * @param destDir
	 *            目标文件所在的目录
	 * @return
	 */
	public static boolean copyGeneralFile(String srcPath, String destDir) {
		boolean flag = false;
		File file = new File(srcPath);
		if (!file.exists()) {
			System.out.println("源文件或源文件夹不存在!");
			return false;
		}
		if (file.isFile()) { // 源文件
			System.out.println("下面进行文件复制!");
			flag = copyFile(srcPath, destDir);
		} else if (file.isDirectory()) {
			System.out.println("下面进行文件夹复制!");
			flag = copyDirectory(srcPath, destDir);
		}

		return flag;
	}

	/**
	 * 复制文件
	 * 
	 * @param srcPath
	 *            源文件绝对路径
	 * @param destDir
	 *            目标文件所在目录
	 * @return boolean
	 */
	private static boolean copyFile(String srcPath, String destDir) {
		boolean flag = false;

		File srcFile = new File(srcPath);
		if (!srcFile.exists()) { // 源文件不存在
			System.out.println("源文件不存在");
			return false;
		}
		// 获取待复制文件的文件名
		String fileName = srcPath
				.substring(srcPath.lastIndexOf(File.separator));
		String destPath = destDir + fileName;
		if (destPath.equals(srcPath)) { // 源文件路径和目标文件路径重复
			System.out.println("源文件路径和目标文件路径重复!");
			return false;
		}
		File destFile = new File(destPath);
		if (destFile.exists() && destFile.isFile()) { // 该路径下已经有一个同名文件
			System.out.println("目标目录下已有同名文件!");
			return false;
		}

		File destFileDir = new File(destDir);
		destFileDir.mkdirs();
		try {
			FileInputStream fis = new FileInputStream(srcPath);
			FileOutputStream fos = new FileOutputStream(destFile);
			byte[] buf = new byte[1024];
			int c;
			while ((c = fis.read(buf)) != -1) {
				fos.write(buf, 0, c);
			}
			fis.close();
			fos.close();

			flag = true;
		} catch (IOException e) {
			//
		}

		if (flag) {
			System.out.println("复制文件成功!");
		}

		return flag;
	}

	/**
	 * 
	 * @param srcPath
	 *            源文件夹路径
	 * @param destPath
	 *            目标文件夹所在目录
	 * @return
	 */
	private static boolean copyDirectory(String srcPath, String destDir) {
		System.out.println("复制文件夹开始!");
		boolean flag = false;

		File srcFile = new File(srcPath);
		if (!srcFile.exists()) { // 源文件夹不存在
			System.out.println("源文件夹不存在");
			return false;
		}
		// 获得待复制的文件夹的名字,比如待复制的文件夹为"E://dir"则获取的名字为"dir"
		String dirName = getDirName(srcPath);
		// 目标文件夹的完整路径
		String destPath = destDir + File.separator + dirName;
		// System.out.println("目标文件夹的完整路径为:" + destPath);

		if (destPath.equals(srcPath)) {
			System.out.println("目标文件夹与源文件夹重复");
			return false;
		}
		File destDirFile = new File(destPath);
		if (destDirFile.exists()) { // 目标位置有一个同名文件夹
			System.out.println("目标位置已有同名文件夹!");
			return false;
		}
		destDirFile.mkdirs(); // 生成目录

		File[] fileList = srcFile.listFiles(); // 获取源文件夹下的子文件和子文件夹
		if (fileList.length == 0) { // 如果源文件夹为空目录则直接设置flag为true,这一步非常隐蔽,debug了很久
			flag = true;
		} else {
			for (File temp : fileList) {
				if (temp.isFile()) { // 文件
					flag = copyFile(temp.getAbsolutePath(), destPath);
				} else if (temp.isDirectory()) { // 文件夹
					flag = copyDirectory(temp.getAbsolutePath(), destPath);
				}
				if (!flag) {
					break;
				}
			}
		}

		if (flag) {
			System.out.println("复制文件夹成功!");
		}

		return flag;
	}

	/**
	 * 获取待复制文件夹的文件夹名
	 * 
	 * @param dir
	 * @return String
	 */
	private static String getDirName(String dir) {
		if (dir.endsWith(File.separator)) { // 如果文件夹路径以"//"结尾,则先去除末尾的"//"
			dir = dir.substring(0, dir.lastIndexOf(File.separator));
		}
		return dir.substring(dir.lastIndexOf(File.separator) + 1);
	}

	/**
	 * 删除文件或文件夹
	 * 
	 * @param path
	 *            待删除的文件的绝对路径
	 * @return boolean
	 */
	public static boolean deleteGeneralFile(String path) {
		boolean flag = false;

		File file = new File(path);
		if (!file.exists()) { // 文件不存在
			System.out.println("要删除的文件不存在!");
		}

		if (file.isDirectory()) { // 如果是目录,则单独处理
			flag = deleteDirectory(file.getAbsolutePath());
		} else if (file.isFile()) {
			flag = deleteFile(file);
		}

		if (flag) {
			System.out.println("删除文件或文件夹成功!");
		}

		return flag;
	}

	/**
	 * 删除文件
	 * 
	 * @param file
	 * @return boolean
	 */
	private static boolean deleteFile(File file) {
		return file.delete();
	}

	/**
	 * 删除目录及其下面的所有子文件和子文件夹,注意一个目录下如果还有其他文件或文件夹
	 * 则直接调用delete方法是不行的,必须待其子文件和子文件夹完全删除了才能够调用delete
	 * 
	 * @param path
	 *            path为该目录的路径
	 */
	private static boolean deleteDirectory(String path) {
		boolean flag = true;
		File dirFile = new File(path);
		if (!dirFile.isDirectory()) {
			return flag;
		}
		File[] files = dirFile.listFiles();
		for (File file : files) { // 删除该文件夹下的文件和文件夹
			// Delete file.
			if (file.isFile()) {
				flag = deleteFile(file);
			} else if (file.isDirectory()) {// Delete folder
				flag = deleteDirectory(file.getAbsolutePath());
			}
			if (!flag) { // 只要有一个失败就立刻不再继续
				break;
			}
		}
		flag = dirFile.delete(); // 删除空目录
		return flag;
	}

	/**
	 * 由上面方法延伸出剪切方法:复制+删除
	 * 
	 * @param destDir
	 *            同上
	 */
	public static boolean cutGeneralFile(String srcPath, String destDir) {
		if (!copyGeneralFile(srcPath, destDir)) {
			System.out.println("复制失败导致剪切失败!");
			return false;
		}
		if (!deleteGeneralFile(srcPath)) {
			System.out.println("删除源文件(文件夹)失败导致剪切失败!");
			return false;
		}

		System.out.println("剪切成功!");
		return true;
	}

	public static void main(String[] args) {
		copyGeneralFile("E://Assemble.txt", "E://New.txt"); // 复制文件
		copyGeneralFile("E://hello", "E://world"); // 复制文件夹
		deleteGeneralFile("E://onlinestockdb.sql"); // 删除文件
		deleteGeneralFile("E://woman"); // 删除文件夹
		cutGeneralFile("E://hello", "E://world"); // 剪切文件夹
		cutGeneralFile("E://Difficult.java", "E://Cow//"); // 剪切文件
	}

}


====================================================================================================================================


 闲来无事,突发奇想,看似简单的ctrl+c  和ctrl+paste  如何用java来实现呢。


    当我们桥下键盘的 ctrl+c  和ctrl+paste 时,系统就会往剪贴板存入数据。数据可以是文本,图像,文件等。就像我们把图片粘贴到QQ窗口,就会出现图像。


      本文只是一个引子,实现了文本和图像的复制粘贴,但却卡在了文件的复制粘贴上。望能得到高人指点,感激涕零,叩头膜拜~~☺


少说废话,上代码,注释在代码里了。

(一)文本的复制粘贴

1. import java.awt.Toolkit;  
2. import java.awt.datatransfer.Clipboard;  
3. import java.awt.datatransfer.DataFlavor;  
4. import java.awt.datatransfer.StringSelection;  
5. import java.awt.datatransfer.UnsupportedFlavorException;  
6. import java.io.IOException;  
7.   
8.   
9.   
10. public class CopyAndPaste {  
11. public static void main(String[] args) {  
12. //copy();   //可以 在键盘上 ctrl + v  
13.         paste();  
14.     }  
15.       
16. public static void copy(){  
17. //得到系统剪贴板  
18. "这是要拷贝的内容";  
19. new StringSelection(text);  
20. null);  
21.     }  
22.       
23. public static void paste(){  
24.         Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();  
25.         DataFlavor flavor = DataFlavor.stringFlavor;  
26. if(clipboard.isDataFlavorAvailable(flavor)){//是否符合剪贴板的数据类型  
27. try {  
28. "此时剪贴版的数据是:" + clipboard.getData(flavor));  
29. catch (UnsupportedFlavorException e) {  
30.                 e.printStackTrace();  
31. catch (IOException e) {  
32.                 e.printStackTrace();  
33.             }  
34.         }  
35.     }  
36. }


 

(二)图像复制粘贴,做了一个UI,对面板分别有 复制、粘贴、清除图像的操作。

1. import java.io.*;  
2. import java.awt.*;  
3. import java.awt.datatransfer.*;  
4. import java.awt.event.*;  
5. import java.awt.image.*;  
6. import javax.swing.*;  
7.   
8. public class ImageTransferTest  
9. {  
10. public static void main(String[] args)  
11.    {  
12. new Runnable()   //awt线程模式,保证事件处理的稳定性  
13.          {  
14. public void run()  
15.             {  
16. new ImageTransferFrame();  
17.                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
18. true);  
19.             }  
20.          });  
21.    }  
22. }  
23.   
24. /**
25.  * 图像面板
26.  */  
27. class ImageTransferFrame extends JFrame  
28. {  
29. public ImageTransferFrame()  
30.    {  
31. "复制粘贴image");     //标题  
32. 600, 600);//  长宽  
33. int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;  
34. int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;  
35. 2,  
36. 2);    //坐标  
37.   
38. new JLabel();  
39. //绘制图像  
40. new BufferedImage(DEFAULT_WIDTH, DEFAULT_HEIGHT, BufferedImage.TYPE_INT_ARGB);  
41.       Graphics g = image.getGraphics();  
42.       g.setColor(Color.WHITE);  
43. 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT);  
44.       g.setColor(Color.RED);  
45. 4, DEFAULT_WIDTH / 4, DEFAULT_WIDTH / 2, DEFAULT_HEIGHT / 2);  
46.   
47. new ImageIcon(image));  
48. new JScrollPane(label), BorderLayout.CENTER);  
49. new JPanel();  
50.   
51. new JButton("Copy");  
52.       panel.add(copyButton);  
53. new ActionListener()  
54.          {  
55. public void actionPerformed(ActionEvent event)  
56.             {  
57. //复制  
58.             }  
59.          });  
60.   
61. new JButton("Paste");  
62.       panel.add(pasteButton);  
63. new ActionListener()  
64.          {  
65. public void actionPerformed(ActionEvent event)  
66.             {  
67. //粘贴  
68.             }  
69.          });  
70.         
71. new JButton("clear");  
72.       panel.add(clearButton);  
73. new ActionListener()  
74.          {  
75. public void actionPerformed(ActionEvent event)  
76.             {  
77. //清除  
78.             }  
79.          });  
80.   
81.       add(panel, BorderLayout.SOUTH);  
82.    }  
83.      
84.      
85. public void clear(){  
86. null);  
87.    }  
88.      
89. /**
90.     * 复制图像到系统的剪贴板
91.     */  
92. private void copy()  
93.    {  
94. //得到系统剪贴板  
95. new ImageTransferable(image);  //图像通道  
96. null);  
97.    }  
98.   
99. /**
100.     * 粘贴图像到系统的剪贴板
101.     */  
102. private void paste()  
103.    {  
104. //得到系统剪贴板  
105. //得到数据  
106. if (clipboard.isDataFlavorAvailable(flavor))   //判断剪贴板是否支持  复制的数据类型  
107.       {  
108. try  
109.          {  
110.             image = (Image) clipboard.getData(flavor);  
111. new ImageIcon(image));  
112.          }  
113. catch (UnsupportedFlavorException exception)  
114.          {  
115. this, exception);  
116.          }  
117. catch (IOException exception)  
118.          {  
119. this, exception);  
120.          }  
121.       }  
122.    }  
123.   
124. private JLabel label;  
125. private Image image;  
126.   
127. private static final int DEFAULT_WIDTH = 600;  
128. private static final int DEFAULT_HEIGHT = 600;  
129. }  
130.   
131. /**
132.  * 实现图像通信的管道接口.
133.  */  
134. class ImageTransferable implements Transferable  
135. {  
136. public ImageTransferable(Image image)  
137.    {  
138.       theImage = image;  
139.    }  
140.   
141. public DataFlavor[] getTransferDataFlavors()  
142.    {  
143. return new DataFlavor[] { DataFlavor.imageFlavor };  
144.    }  
145.   
146. public boolean isDataFlavorSupported(DataFlavor flavor)  
147.    {  
148. return flavor.equals(DataFlavor.imageFlavor);  
149.    }  
150.   
151. public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException  
152.    {  
153. if (flavor.equals(DataFlavor.imageFlavor))  
154.       {  
155. return theImage;  
156.       }  
157. else  
158.       {  
159. throw new UnsupportedFlavorException(flavor);  
160.       }  
161.    }  
162.   
163. private Image theImage;  
164. }