ディレクトリ内のすべてのファイルを削除します(ディレクトリは削除しません)-ワンライナーソリューション


201

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

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

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


2
これは、ディレクトリの削除に.deleteDirectoryが使用されているためです(名前でもそのことを示しています)。ファイルがディレクトリでない場合は、それが入っているディレクトリを取得します。
user1534664

FileUtilsクラス内で、ディレクトリの代わりにファイルを削除する他の関数を探してみてください。
user1534664


1
なぜ特にワンライナーが必要なのですか?サードパーティのライブラリメソッドは再帰的にのみ実行するため、パフォーマンスを基準にすることはできません。それであなたは同じパフォーマンスを得るでしょうか?
Rohit Jain

1
できることの1つは、ディレクトリを削除してから再作成することです。を使用するrm -rf directory; mkdir directory方がを使用するよりも高速であることがわかりましたFileUtils.cleanDirectory
Joshua Pinter、

回答:


362
import org.apache.commons.io.FileUtils;

FileUtils.cleanDirectory(directory); 

同じファイルで利用可能なこのメソッドがあります。これにより、すべてのサブフォルダーとその下のファイルも再帰的に削除されます。

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


49
これは、人々がこれを調べなくてはならないのを防ぐためにもいいものです。ここにインポートがあります:import org.apache.commons.io.FileUtils;
ポールグレゴワール2013

5
インポートが見つからない理由を調べなければなりません。これは、apache.orgからダウンロードする必要があるためです。
トマーシュZato -復活モニカ

かなりの解決策。このlibをgradleで確認します。「commons-io:commons-io:+」をコンパイルします
Leo Nguyen '26

1
Gradleの依存関係 -コンパイルグループ: 'commons-io'、名前: 'commons-io'、バージョン: '2.5'。
Jaydev 2016年

呼び出しrm -rf directoryはを使用するよりもはるかに効率的であることに注意してくださいFileUtils.cleanDirectory
Joshua Pinter、

267

のような意味ですか?

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

これにより、ディレクトリではなくファイルのみが削除されます。


65
外部ライブラリを使用しないので、これは間違いなく良い答えです。
AlexWien 2013年

10
@amarですが、それでも、標準の方法がある場合、同じことをする外部の方法を使用する理由はありません。ある日、彼はlibを削除したいかもしれません、またはlibはもはやサポートされていないか、ライセンス上の理由などでlibの使用が許可されていません(これはすべてこの特定のlibの問題ではないかもしれませんが、その他多数)
AlexWien 2013

10
ルートの「dir」ディレクトリ内にサブディレクトリがある場合、これはすべての削除に失敗します。
ティアゴ

2
@TiagoT True、これは空でないサブディレクトリを削除しません。
Peter Lawrey 2013

4
for(File file: dir.listFiles())おそらく次のような意味ですfor (File file : new java.io.File("C:\\DeleteMeFolder").listFiles())... ...
Hartmut P.

62

ピーター・ローリーの答えは素晴らしく、特別なことに依存していないので素晴らしいです。サブディレクトリとその内容も削除する必要がある場合は、再帰を使用します。

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()方法を。


1
一方、外部ライブラリを最初に使用する人がいない場合、他のユーザーがその外部ライブラリで同様の動作を期待する可能性は低く、そこに表示される可能性は低くなります...ここで発明されていませんか?ライブラリがまとまりがあり、プロジェクトに簡単に追加できる場合は、ほとんどの場合、ライブラリを追加することを好みます。
JB Rainsberger

33

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の処理が必要です


1
2つ目はサブディレクトリを削除しません(テスト済み)
edwise '13年

1
@edwiseはい、それはABCからすべてのファイルを削除し、サブディレクトリからすべてのファイルを削除します。英語は少し曖昧です。
NonlinearFruit

11

またはこれをJava 8で使用するには:

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

例外処理が非常にかさばるのは残念ですが、そうでなければワンライナーになります...


どのようにそのファイルが知っているIS実際にではなく、ディレクトリのファイルを?
ステファン

1
ディレクトリも削除するため、トピックの問題に対する解決策ではありません
Marx

5
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");
} }  }}

2

別の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をスローすることです。これは、ストリームで処理するのが面倒です。

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


ウォーク関数でnullを返すのではなく、空のストリーム(Stream.empty())を返す方が適切です。よりクリーンで、関数は常にストリームを返します。可能な場合はnullを回避する必要があります。
kaba713 2018

おかげで、私はあなたの提案で答えを改善しました
18:28の

2

ディレクトリからすべてのファイルを削除するには、「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

rm -rfよりもはるかに高性能でしたFileUtils.cleanDirectory

ワンライナーソリューションではありませんが、広範なベンチマークを行った結果、使用のrm -rf方が使用よりも数倍高速であることがわかりましたFileUtils.cleanDirectory

もちろん、ディレクトリが小さい場合や単純な場合でも問題はありませんが、私たちのケースでは、数ギガバイトの深くネストされたサブディレクトリがあり、で10分以上FileUtils.cleanDirectoryrm -rf

これを行うための大まかなJava実装を以下に示します。

// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( File file ) throws IOException, InterruptedException {

    if ( file.exists() ) {

        String deleteCommand = "rm -rf " + file.getAbsolutePath();
        Runtime runtime = Runtime.getRuntime();

        Process process = runtime.exec( deleteCommand );
        process.waitFor();

        file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.

        return true;
    }

    return false;

}

大規模なディレクトリや複雑なディレクトリを扱う場合は、試してみる価値があります。


1
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"))

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


0

私はこれがうまくいくと思います(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);

乾杯!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.