web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルを削除する(ただしディレクトリは削除しない) - 1つのライナーソリューション

ABCディレクトリ内のすべてのファイルを削除したい.

FileUtils.deleteDirectory(new File("C:/test/ABC/"));を試したときには、フォルダABCも削除されます。

ディレクトリ内ではなくディレクトリ内のファイルを削除できるワンライナーソリューションはありますか?

175
Fahim Parkar
FileUtils.cleanDirectory(directory); 

このメソッドは同じファイルにあります。これにより、その下にあるすべてのサブフォルダとファイルも再帰的に削除されます。

ドキュメント: org.Apache.commons.io.FileUtils.cleanDirectory

307
Reddy

あなたは好きですか?

for(File file: dir.listFiles()) 
    if (!file.isDirectory()) 
        file.delete();

これでファイルは削除され、ディレクトリは削除されません。

244
Peter Lawrey

Peter Lawreyの答えは、シンプルで特別なものに依存していないので素晴らしいものです。それが、あなたがそうすべき方法です。サブディレクトリとその内容も削除するものが必要な場合は、再帰を使用してください。

void purgeDirectory(File dir) {
    for (File file: dir.listFiles()) {
        if (file.isDirectory())
            purgeDirectory(file);
        file.delete();
    }
}

サブディレクトリとその内容(質問の一部)を捨てるには、次のように変更します。

void purgeDirectoryButKeepSubDirectories(File dir) {
    for (File file: dir.listFiles()) {
        if (!file.isDirectory())
            file.delete();
    }
}

あるいは、1行のソリューションを望んでいたので。

for (File file: dir.listFiles())
    if (!file.isDirectory())
        file.delete();

このような些細な作業に外部ライブラリを使用することは、他の目的でこのライブラリを必要としない限り、お勧めできません。あなたはとにかくApacheライブラリを使っているように見えるので、そのFileUtils.cleanDirectory()メソッドを使ってください。

59
ChrisB

Java 8ストリーム

これはABCからのファイルだけを削除します(サブディレクトリはそのままです):

Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);

これはABC(およびサブディレクトリ)からファイルだけを削除します。

Files.walk(Paths.get("C:/test/ABC/"))
                .filter(Files::isRegularFile)
                .map(Path::toFile)
                .forEach(File::delete);

^このバージョンはIOExceptionを処理する必要があります

27
NonlinearFruit

あるいはJava 8でこれを使うには:

try {
  Files.newDirectoryStream( directory ).forEach( file -> {
    try { Files.delete( file ); }
    catch ( IOException e ) { throw new UncheckedIOException(e); }
  } );
}
catch ( IOException e ) {
  e.printStackTrace();
}

それは例外処理がとてもかさばる残念です、そうでなければそれはワンライナーになるでしょう...

11
public class DeleteFile {
    public static void main(String[] args) {
        String path="D:\test"; 
        File file = new File(path);
        File[] files = file.listFiles(); 
        for (File f:files) 
        {if (f.isFile() && f.exists) 
            { f.delete();
system.out.println("successfully deleted");
            }else{
system.out.println("cant delete a file due to open or error");
} }  }}
5

フォルダのすべてのコンテンツ、サブディレクトリを含むがフォルダ自体は削除しない、もう1つのJava 8 Streamソリューション。

使用法:

Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);

そしてコード:

public interface CleanFolder {
    static void clean(Path folder) throws IOException {

        Function<Path, Stream<Path>> walk = p -> {
            try { return Files.walk(p);
        } catch (IOException e) {
            return Stream.empty();
        }};

        Consumer<Path> delete = p -> {
            try {
                Files.delete(p);
            } catch (IOException e) {
            }
        };

        Files.list(folder)
            .flatMap(walk)
            .sorted(Comparator.reverseOrder())
            .forEach(delete);
    }
}

Files.walkまたはFiles.deleteを含むすべてのストリームソリューションの問題は、これらのメソッドがストリームで処理するのに苦痛なIOExceptionをスローすることです。

できるだけ簡潔なソリューションを作成しようとしました。

2
hijack

ディレクトリからすべてのファイルを削除するための "C:\ Example"

File file = new File("C:\\Example");      
String[] myFiles;    
if (file.isDirectory()) {
    myFiles = file.list();
    for (int i = 0; i < myFiles.length; i++) {
        File myFile = new File(file, myFiles[i]); 
        myFile.delete();
    }
}
2
Mahesh Narwade
package com;
import Java.io.File;
public class Delete {
    public static void main(String[] args) {

        String files; 
        File file = new File("D:\\del\\yc\\gh");
        File[] listOfFiles = file.listFiles(); 
        for (int i = 0; i < listOfFiles.length; i++) 
        {
            if (listOfFiles[i].isFile()) 
            {
                files = listOfFiles[i].getName();
                System.out.println(files);
                if(!files.equalsIgnoreCase("Scan.pdf"))
                {
                    boolean issuccess=new File(listOfFiles[i].toString()).delete();
                    System.err.println("Deletion Success "+issuccess);
                }
            }
        }
    }
}

すべてのファイルを削除したい場合は削除

if(!files.equalsIgnoreCase("Scan.pdf"))

それは動作しますステートメント。

1
Mahesh

これはうまくいくと思います(NonlinearFruitの以前の回答に基づいて):

Files.walk(Paths.get("C:/test/ABC/"))
                .sorted(Comparator.reverseOrder())
                .map(Path::toFile)
                .filter(item -> !item.getPath().equals("C:/test/ABC/"))
                .forEach(File::delete);

乾杯!

0
dansouza