递归与非递归操作目录

最近在做个两台机器通过socket传目录的功能,在传的过程中需要展示进度条,所以进度的展示总需要先统计文件数或文件的大小才能展现,递归的实现就不能用了。
后来是通过先把目录下所有的文件和文件夹列一遍,放到两个List中,另一端按照相应的结构创建目录,再接收传来的socket。
所以顺手又写了写递归与非递归处理目录的代码。

public void recursiveDeleteDir(String dir) {
File f = new File(dir);
if(f.isFile()) {
f.delete();
return;
}
File[] files = f.listFiles();

for(int i=0; i< files.length; i++) {
if(files[i].isDirectory()) {
if(files[i].list().length == 0) {
files[i].delete();
}else {
recursiveDeleteDir(files[i].getAbsolutePath());
}
} else {
files[i].delete();
}
}
}

public void nonRecursiveDeleteDir(String dir) {
File f = new File(dir);
if(f.isFile()) {
f.delete();
return;
}
LinkedList<File> list = new LinkedList<File>();
list.add(f);
while(list.size() > 0 ) {
File temp = list.removeFirst();
File[] files = temp.listFiles();
for(int i=0;i < files.length; i++) {
if(files[i].isDirectory()) {
if(files[i].listFiles().length == 0) {
files[i].delete();
}else {
list.add(files[i]);
}
}else {
files[i].delete();
}
}
}
}



///以下为递归拷贝//
public void recursiveCopyDir(String src, String dest) {
File f = new File(src);
String[] files = f.list();
for(int i=0; i<files.length; i++) {
File temp = new File(src,files[i]);
if(temp.isDirectory()) {
File t = new File(dest,files[i]);
if(!t.exists()) {
t.mkdirs();
}
recursiveCopyDir(temp.getAbsolutePath(),new File(dest,files[i]).getAbsolutePath());
}else {
try {
FileInputStream fis = new FileInputStream(temp);
FileOutputStream fos = new FileOutputStream(new File(dest,files[i]));
byte[] b = new byte[1024];
int x = -1;
while( (x = fis.read(b)) != -1) {
fos.write(b);
}
fos.flush();
fis.close();
fos.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

public void nonRecursiveCopyDir(String src, String dest) {
File f = new File(src);
LinkedList<File> list = new LinkedList<File>();
list.add(new File(src));
while(list.size() > 0) {
File removed = list.removeFirst();
File[] fik = removed.listFiles();
for(int i=0; i< fik.length; i++) {
String subpath = fik[i].getAbsolutePath().substring(src.length());
File destFile = new File(dest +subpath);
if(fik[i].isDirectory()) {
if(!destFile.exists()) {
destFile.mkdirs();
}
list.add(fik[i]);
}else {
try {
FileInputStream fis = new FileInputStream(fik[i]);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] b = new byte[1024];
int x = -1;
while( (x = fis.read(b)) != -1) {
fos.write(b);
}
fos.flush();
fis.close();
fos.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
String[] files = f.list();
for(int i=0; i<files.length; i++) {
File temp = new File(src,files[i]);
if(temp.isDirectory()) {
File t = new File(dest,files[i]);
if(!t.exists()) {
t.mkdirs();
}
recursiveCopyDir(temp.getAbsolutePath(),new File(dest,files[i]).getAbsolutePath());
}else {

}
}
}


以下用于递归和非递归显示目录内容/
public void recursiveDir(String dir) {
File f = new File(dir);
File[] files = f.listFiles();
for(File x : files) {
if (x.isDirectory()) {
recursiveDir(x.getAbsolutePath());
} else {
System.out.println(x.getAbsolutePath());
}
}
}

public void nonRecursiveDir(String dir) {
File f = new File(dir);
LinkedList<File> list = new LinkedList<File>();
list.add(f);
while(list.size() > 0) {
File file = list.removeFirst();
File[] files = file.listFiles();
for(File x : files) {
if (x.isDirectory()) {
list.add(x);
} else {
System.out.println(x.getAbsolutePath());
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值