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. }