import java.io.File;
import javax.swing.JOptionPane;
public class File6_1 {
public static void deleteFold(String s){
File fl1=new File(s);
if(fl1.exists()){
System.out.println("目录(" +s+")存在");
if(fl1.delete()){
System.out.println("该目录删除成功");
}else{
//System.out.println("该目录删除失败");//表明该文件夹下存在文件
System.out.println("目录(" +fl1.getName()+ ")下还有文件,将一起删除!");
File[] file=fl1.listFiles();
for(int i=0;i<file.length;i++){
if (!file[i].canRead()) {
    continue;
}
if (!file[i].canWrite()) {
    continue;
}
if (file[i].isHidden()) {//这是为了防止碰上类似系统文件导致出现错误
    continue;
}
if(file[i].isFile()){
System.out.println("删除文件:" +file[i].getName()+ "中……");
file[i].delete();
}
if(file[i].isDirectory()){
deleteFold(file[i].getAbsolutePath());
}
}
//该文件夹下的文件都删除后,就可以删除该文件夹了
if(fl1.delete()){
System.out.println("目录(" +fl1.getName()+ ")删除成功");
}else{
System.out.println("目录(" +fl1.getName()+ ")删除失败");
}
}
}else{
System.out.println("目录(" +s+")不存在");
}
}

public static void main(String[] args){
String s=JOptionPane.showInputDialog("请输入要删除的目录");
deleteFold(s);
JOptionPane.showMessageDialog(null,"程序执行完毕!");
}
}
以上代码在删除文件的时候,如果把if (file[i].isHidden()) {//这是为了防止碰上类似系统文件导致出现错误
continue;
}当搜索到类似System Volume Information这些系统文件夹的时候就会抛出异常,即便程序中已经加入了if (!file[i].canRead()) {
    continue;
}
if (!file[i].canWrite()) {
    continue;
}
等判断其是否可读,可写。所以特别想问下,如果让java跳过这些不可读的系统文件;另外还有个问题就是,如何判断一个文件是否被另一个程序使用,因为使用状态下也是无法删除的,谢谢!

解决方案 »

  1.   

    呵呵,先不说异常。你的程序有一个很大滴问题。如果有一个目录:E:\A\B\C\D.txt,你想删除A目录,发现下面有B目录,你就删除B,可是下面还有C,你删除失败,嘿嘿。
    所以,正常的删除方法是遍历该目录下的所有子目录及文件,而遍历的方法,简单一点,直接用递归,好一点的,用栈。
      

  2.   

    对于文件目录遍历,其实就是多叉树的遍历,文件夹是内部节点,文件就是叶节点。可以用递归实现,要用后序遍历。“如何判断一个文件是否被另一个程序使用”这个问题,可以使用nio中的文件锁机制
    通过FileChannel.lock或FileChannel.tryLock来实现文件加锁,它是通过操作系统的底层机制完成的,所以可以实现上述要求。如果文件正被另一个程序使用,会一直阻塞。也可以用带超时的locklz仔细看一下API吧
      

  3.   

    你可以去查查API文档,
    canRead的说明中有
    抛出: 
    SecurityException - 如果存在安全管理器,且其 SecurityManager.checkRead(java.lang.String) 方法拒绝对文件进行读取访问
    嘿嘿,canRead也可能抛出异常的。其实抛出也没关系啊,你在可能抛出异常的地方加上一层try-catch,不就行了
      

  4.   

    另外,碰到异常时抛出如下
    目录(e:\\System Volume Information)存在
    目录(System Volume Information)下还有文件!
    Exception in thread "main" java.lang.NullPointerException
    at io.file.File6_2.selectFold(File6_2.java:17)
    at io.file.File6_2.selectFold(File6_2.java:35)
    at io.file.File6_2.main(File6_2.java:45)