关于Java File Delete

sddcc123 2011-11-21 03:27:22
首先有一个非空的文件夹(内包含子文件夹,子文件夹内包含文件)

我将文件夹内的子文件夹拷贝出来,代码如下:

public class DirCopy {
private static final Logger logger = Logger.getLogger(DirCopy.class);
public static boolean copy(String file1, String file2) {

File in = new File(file1);
File out = new File(file2);
if (!in.exists()) {
logger.error(in.getAbsolutePath() + "源文件路径错误!!!");
return false;
} else {
logger.debug("源文件路径" + in.getAbsolutePath());
logger.debug("目标路径" + out.getAbsolutePath());
}
if (!out.exists())
out.mkdirs();
File[] file = in.listFiles();
FileInputStream fin = null;
FileOutputStream fout = null;
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
try {
fin = new FileInputStream(file[i]);
} catch (FileNotFoundException e) {
logger.error("[execute()]catch:" + e.getMessage());
}
System.out.println("in.name=" + file[i].getName());
try {
fout = new FileOutputStream(new File(file2 + AppConfig.get("jr.dir.FileSeparator")
+ file[i].getName()));
} catch (FileNotFoundException e) {
logger.error("[execute()]catch:" + e.getMessage());
}
//System.out.println(file2);
int c;
byte[] b = new byte[1024 * 5];
try {
while ((c = fin.read(b)) != -1) {

fout.write(b, 0, c);
System.out.println("复制文件中!");
}
fin.close();
fout.flush();
fout.close();
} catch (IOException e) {
logger.error("[execute()]catch:" + e.getMessage());
}
} else
copy(file1 + AppConfig.get("jr.dir.FileSeparator") + file[i].getName(), file2 + AppConfig.get("jr.dir.FileSeparator")
+ file[i].getName());
}

return true;

}



然后删除该文件夹,代码如下:

public static void deleteDir(File dir) {
if (dir == null || !dir.exists() || !dir.isDirectory())
return; // 检查参数
for (File file : dir.listFiles()) {
if (file.isFile())
file.delete(); // 删除所有文件
else if (file.isDirectory())
deleteDir(file); // 递规的方式删除文件夹
}
dir.delete();// 删除目录本身
}



问题是:删除文件夹时,发现只能删除文件夹中的第一个子文件夹。IO流我查了,发现已经关闭了,用了Unlocker发现文件被占用。后来我改用while(!file.delete)发现文件是可以被删除的,但是要等好久,请大侠解释以上问题
...全文
543 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sddcc123 2011-11-22
  • 打赏
  • 举报
回复
未发现异常
[Quote=引用 3 楼 jc8futao 的回复:]

从删除文件的代码上,没发现什么逻辑错误,有异常吗?
[/Quote]
sddcc123 2011-11-22
  • 打赏
  • 举报
回复
这个真没有
[Quote=引用 5 楼 zyz1985 的回复:]

代码我感觉无问题,我自己也测试了下删除正常着哩,楼主是不是有窗口打开了要删除的某个目录?
[/Quote]
  • 打赏
  • 举报
回复
文件不能调用file.listFiles(),只有文件夹才行。。

public static void main(String[] args)
{
deleteFile(new File("e:\\"));
}

public static void deleteFile(File file)
{
if(file.isFile())
{
file.delete();
}
else
{
File[] files = file.listFiles();
for(File itemFile:files)
{
deleteFile(itemFile);
}
file.delete();
}
}
Jlins 2011-11-21
  • 打赏
  • 举报
回复
dir.listFiles()
你是一遍列出来一边删除吧,感觉你的删除可能会多listFiles()结果有影响,可以尝试先list目录到数组中,然后迭代数组进行删除
游一游走一走 2011-11-21
  • 打赏
  • 举报
回复
代码我感觉无问题,我自己也测试了下删除正常着哩,楼主是不是有窗口打开了要删除的某个目录?
jc8futao 2011-11-21
  • 打赏
  • 举报
回复
dir.listFiles()在迭代里面改变了,会对for有影响吗?
jc8futao 2011-11-21
  • 打赏
  • 举报
回复
从删除文件的代码上,没发现什么逻辑错误,有异常吗?
若干年 2011-11-21
  • 打赏
  • 举报
回复
建议你用
org.apache.commons.io包的FileUtils类
4行代码就搞定
sddcc123 2011-11-21
  • 打赏
  • 举报
回复
说错了,用Unlocker时发现文件未被占用

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧