java剪切文件
今天改bug遇到个小问题,将文件解压后不想要改文件外面包着的文件夹,要是windows下面直接就是一顿ctrl+x再来个delete。。。
//如果有一层文件夹,将里面的文件剪切到外面
File dirFile = new File(unZipDir + dir);
if (dirFile.isDirectory()) {
try {
copyDir(unZipDir.getPath(), dirFile.getPath(), unZipDir.getPath());
} catch (IOException e) {
e.printStackTrace();
}
// dirFile.delete();
deleteDir(dirFile, false);
}
这时候文件已经
解压
好了,先得到该解压好的文件夹,我这路径按照原有的程序拼接了一哈:
unZipDir+dir
,
如果说解压出来是一个文件夹包着的,就先开始剪切里面的所有文件出来。
public static void copyDir(String path, String sourcePath, String newPath) throws IOException {
File file = new File(sourcePath);
String[] files = file.list();
if (!(new File(newPath)).exists()) {
(new File(newPath)).mkdir();
}
for (int i = 0; i < files.length; i++) {
if ((new File(sourcePath + file.separator + files[i])).isDirectory()) {
copyDir(path, sourcePath + file.separator + files[i], path + file.separator + files[i]);
}
if (new File(sourcePath + file.separator + files[i]).isFile()) {
copyFile(sourcePath + file.separator + files[i], newPath + file.separator + files[i]);
}
}
}
path:是解压的目录
sourcePath:就是需要剪切出来的文件夹
newPath:就是剪切出来放的路径
比如我
把解压的文件放入
userPage/1/65
下面,解压包为
lgg.zip
,那么我的
path
就是
userPage/1/65
,
sourcePath
是
userPage/1/65/lgg
,
newPath
是
userPage/1/65
。
看代码,
先
得到sourcePath这个文件以及里面的所有文件,然后创建newPath这个文件夹
tip:因为我们只需要创建一个新的文件夹,所以使用mkdir()这个方法,mkdirs()这个方法会根据你的路径创建多个目录,这里不需要。
然后
遍历sourcePath文件夹里面所有文件,根据文件的类型分别创建文件或文件夹,创建文件夹继续调用copyDir()方法,创建文件使用
public static void copyFile(String oldPath, String newPath) throws IOException {
File oldFile = new File(oldPath);
File file = new File(newPath);
FileInputStream in = new FileInputStream(oldFile);
FileOutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[2097152];
int readByte = 0;
while ((readByte = in.read(buffer)) != -1) {
out.write(buffer, 0, readByte);
}
in.close();
out.close();
}
注意传参传入路径的区别
file.separator 也就是FIle类固定的一个符号”\”路径分隔符应该叫。
file[i]也就是遍历到的文件名称。
注意复制文件时,如果该文件不是在根目录下,那么他的newPath应该是
新的文件夹路径+file.separator+file[i]
,我们需要把他放进它本该在的文件夹,不然所有的文件都会暴露在根目录下。。。
所有文件复制完成,
最后
我们将解压出来的文件夹以及所有里面所有文件删除。
不可直接调用delete()方法,这个dirFile是一个文件夹,如果里面存在任何文件将删除失败,所以还需要遍历去删除其中的数据。
private static boolean deleteDir(File dir, boolean keepRoot) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]), false);
if (!success) {
return false;
}
}
}
// The directory is now empty so now it can be smoked
if (!keepRoot) {
return dir.delete();
} else {
return true;
}
}
遍历文件夹的子子孙孙,将所有文件删除,我这边操作是整个文件夹删除,就不保留空文件夹了,keepRoot传false值。
打完收工!!!