如何删除目录但不删除文件夹的文件

问题描述 投票:2回答:6

我创建了一些删除文件夹中所有文件的代码,问题是这很好,我希望能够删除目录中的所有文件,但保留文件夹完整,所以我不必进入每个文件文件夹并删除其中的文件,这是我目前的代码:

@ViewScoped
@ManagedBean
public class Delete {

    public void DeleteFiles() throws IOException {
        System.out.println("Called deleteFiles");
        File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/up617648/");

        String[] myFiles;
        if (file.isDirectory()) {
            myFiles = file.list();
            for (int i = 0; i < myFiles.length; i++) {
                File myFile = new File(file, myFiles[i]);
                System.out.println(myFile);
                myFile.delete();
            }
            DeleteFiles2();
        }

    }
    public void DeleteFiles2() throws IOException {
        System.out.println("Called deleteFiles2");
        File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/up617648/");

        String[] myFiles;
        if (file.isDirectory()) {
            myFiles = file.list();
            for (int i = 0; i < myFiles.length; i++) {
                File myFile = new File(file, myFiles[i]);
                System.out.println(myFile);
                myFile.delete();
            }
        }

    }
}

我怎么能修改我的代码才能实现这个目标?

编辑:

我已将代码更改为:

@ViewScoped
@ManagedBean
public class Delete {

    public void DeleteFiles() throws IOException {
        System.out.println("Called deleteFiles");
        File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");

        String[] myFiles;
        if (file.isDirectory()) {
            myFiles = file.list();
            for (int i = 0; i < myFiles.length; i++) {
                File myFile = new File(file, myFiles[i]);
                System.out.println(myFile);
               if (!myFile.isDirectory()) {
                    myFile.delete();
                }
            }
            DeleteFiles2();
        }

    }

虽然这确实调用了所有文件夹,但这是我的控制台:

INFO: Called deleteFiles
INFO: D:\Documents\NetBeansProjects\printing~subversion\fileupload\web\resources\pdf\cam01342
INFO: D:\Documents\NetBeansProjects\printing~subversion\fileupload\web\resources\pdf\geg00061
INFO: D:\Documents\NetBeansProjects\printing~subversion\fileupload\web\resources\pdf\null
INFO: D:\Documents\NetBeansProjects\printing~subversion\fileupload\web\resources\pdf\up617648
INFO: D:\Documents\NetBeansProjects\printing~subversion\fileupload\web\resources\pdf\up626088
INFO: Called deleteFiles2

Tt不会删除这些文件夹中的文件,我该怎么做?

编辑3:使用递归我现在收到堆栈溢出错误。

这是我的代码:

public void DeleteFiles() {
    File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles();
        }
    } else {
        file.delete();
    }
}
java delete-file
6个回答
11
投票

为什么不这样做呢

if (!myFile.isDirectory()) myFile.delete();

代替

myFile.delete();

?


3
投票

只需使用File.isDirectory()

只需检查它是文件还是目录。如果是文件则删除它,否则保留

在你的情况下

if (!(myFile.isDirectory()))
{
 myFile.delete();
}

3
投票

使用递归它非常整洁;-)

private void deleteFiles(File file) {
    if (file.isDirectory())
        for (File f : file.listFiles())
            deleteFiles(f);
    else
        file.delete();
}

3
投票

我认为这样做

public void deleteFiles(File folder) throws IOException {
    List<File> files = folder.listFiles()
    foreach(File file: files){
        if(file.isFile()){
            file.delete();
        }else if(file.isDirecotry()) {
            deleteFiles(file)
        }
    }
}

然后你需要打电话给deleteFiles(new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"));


1
投票

递归是过度的,正如需要后续问题这一事实证明的那样。在那里看到我的答案更简单:

Recursive deletion causing a stack overflow error


0
投票

你可以使用以下方法。

public void deleteFiles(File folder) throws IOException {
    File[] files = folder.listFiles();
     for(File file: files){
            if(file.isFile()){
                String fileName = file.getName();
                boolean del= file.delete();
                System.out.println(fileName + " : got deleted ? " + del);
            }else if(file.isDirectory()) {
                deleteFiles(file);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.