スライドショー

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

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

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

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

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

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

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

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

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

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メソッドでファイルを削除しています。

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

【Java入門】Fileの削除(delete、強制削除、拡張子の指定)
更新日 : 2017年8月23日

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

ファイルを削除する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クラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

JavaのFileクラスをマスター!基礎から便利な使い方まで総まとめ
更新日 : 2019年5月10日

まとめ

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

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

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説