【Java入門】Fileの削除(delete、強制削除、拡張子の指定)

こんにちは!フリーエンジニアのヤマシタです。

Javaでファイル操作に使用するFileクラスはさまざまな機能があります。

この記事では、ファイル操作で必要な、

・ファイルを削除する方法
・ディレクトリを削除する方法

という基本的な内容から、

・削除できないファイルを強制的に削除する方法
・ディレクトリ配下のファイルを全て削除する方法
・拡張子を指定して削除する方法

などの応用的な使い方に関しても解説していきます。

今回はそんな悩みを解決するために、ファイルの削除方法について、わかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

deleteでファイルを削除する方法

ファイルを削除するには、Fileクラスのdeleteメソッドを使用します。

deleteメソッドはboolean型の値を返します。

public boolean delete()

以下にdeleteメソッドを使用した、ファイルの削除方法を記述します。

import java.io.File;

public class FileClass {

    public static void main(String[] args) {
        File file = new File("/Users/Shared/java/java.txt");
 
        //deleteメソッドを使用してファイルを削除する
        file.delete();
    }

}

このサンプルコードでは、Fileクラスのインスタンスの引数に絶対パスでファイルを指定し、deleteメソッドでファイルを削除しています。

ファイルの基本的な削除方法や、ディレクトリを削除する方法については、以下の記事でも詳しく解説しています!

削除できないファイルを強制的に削除するには

ファイルを削除するdeleteメソッドを実行しても、ファイルの削除に失敗する場合があります。

deleteメソッドは、削除に失敗した場合や、ファイル自体が存在しない場合及び、削除対象のファイルをユーザーが開いていた場合なども、ファイルの削除が失敗してしまうこともあります。

しかし、Javaにはファイルを強制的に削除する方法はありません

そのため、削除に失敗した場合は、以下のように指定した回数分ループでリトライする方法があります。

import java.io.File;
import java.lang.Thread;

public class FileClass {

    public static void main(String[] args) {
        File file = new File("/Users/Shared/java/java.txt");
        
        //ファイルが削除されるまで指定回数分ループする
        for(int i=0; i<100; i++) {
            if(file.delete()) {
                System.out.println("ファイル削除成功");
                break;
            } else {
                System.out.println("ファイル削除失敗");
                //失敗したら、1秒ごとにスリープしてリトライする
                try {
                    Thread.sleep(1000);
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

このサンプルコードでは、リトライ回数を100で設定し、ファイルの削除に失敗したら、sleepメソッドを使用して1秒スリープ後に、再びファイル削除を実行しています。

ディレクトリ配下の全てのファイルを削除する

Fileクラスのdeleteメソッドは、基本的に1つのファイルしか削除できません

しかし、場合によっては複数のファイルをまとめて削除したい場合があります。

以下に、再帰的に自身を呼び出して、指定したディレクトリの配下のファイルをまとめて削除する方法を記述します。

import java.io.File;

// 再帰的に自身を呼び出してファイルを削除するためのクラス
class FileClass {
 
    public static void fileClass(File dir) {        
        //ディレクトリ配下のファイルを削除する
        if(dir.exists()) {
            
            if(dir.isFile()) {
                if(dir.delete()) {
                    System.out.println("ファイル削除");
                }
            } else if(dir.isDirectory()) {
                File[] files = dir.listFiles();
                
                if(files == null) {
                    System.out.println("配下にファイルが存在しない");
                }
                //for文でファイルリスト分ループする
                for(int i=0; i<files.length; i++) {
                    
                    //ファイルの存在確認
                    if(files[i].exists() == false) {
                        continue;
                    //ファイルの場合は再帰的に自身を呼び出して削除する
                    } else if(files[i].isFile()) {
                        fileClass(files[i]);
                        System.out.println("ファイル削除2");
                    }        
                }
            }
        } else {
            System.out.println("ディレクトリが存在しない");
        }
    }
}

public class FileDelete {
 
    public static void main(String[] args) {
        FileClass fc = new FileClass();
        File dir = new File("/Users/Shared/java/");
        FileClass.fileClass(dir);
    }

}

このサンプルコードでは、mainメソッドで、Fileクラスでファイルを削除するディレクトリを指定しています。

次にfileClassで引数に渡されたFileクラスのオブジェクトを指定して、削除処理を実施しています。

指定したディレクトリの配下にファイルがある場合は、listFilesメソッドで取得したリスト分ループし、ファイルの場合は再帰的に自身を呼び出してファイルを削除しています。

拡張子を指定して削除する方法

javaでは基本的に削除処理で正規表現や、ワイルドカードを使用しての削除はできません

しかし、指定した文字列や拡張子が含まれているファイルを指定して削除することは可能です。

以下にファイルの拡張子が”*.java”の場合は、ファイルを削除する方法を記述します。

import java.io.File;

// 再帰的に自身を呼び出してファイルを削除するためのクラス
class FileClass {
 
    public static void fileClass(File dir) {        
        if(dir.exists()) {
            
            if(dir.isFile()) {
                if(dir.delete()) {
                    System.out.println("ファイル削除");
                }
            } else if(dir.isDirectory()) {
                File[] files = dir.listFiles();
                
                if(files == null) {
                    System.out.println("配下にファイルが存在しない");
                }
                //for文でファイルリスト分ループする
                for(int i=0; i<files.length; i++) {
                    
                    File file = files[i];
                    
                    System.out.println(file.toString());
                    
                    //ファイルの存在確認
                    if(files[i].exists() == false) {
                        continue;
                    //ファイルの場合は再帰的に自身を呼び出して削除する
                    } else if(files[i].isFile()) {
                        //拡張子が".java"であればファイルを削除
                        if(file.getPath().endsWith(".java")) {
                            fileClass(files[i]);
                            System.out.println("ファイル削除2");
                        }
                    }        
                }
            }
        } else {
            System.out.println("ディレクトリが存在しない");
        }
    }
}

public class FileDelete {

    public static void main(String[] args) {
        FileClass fc = new FileClass();
        File dir = new File("/Users/Shared/java/");
        FileClass.fileClass(dir);
    }

}

このサンプルコードでは、listFilesメソッドで取得したリスト分ループし、getPathメソッドでファイルとファイルパスを取得しています。

endsWithメソッドで拡張子が”.java”の場合は、再帰的にファイルを削除する処理をしています。

Fileクラスについてもっと詳しく知りたい方へ

Fileクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

ここではFileクラスを使用した、ファイルを削除するdeleteメソッドや応用的な削除方法について説明しました。

ファイルの削除処理自体は、deleteメソッドを使用するだけで簡単に行えますが、まとめて削除したり、特定の条件で削除したい場合は、処理を工夫しなければいけません。

もしファイルを削除する処理を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

システムエンジニアとして10年勤務→フリーランスへ。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

目次