【8/31まで 今季最大のセール開催中!】Udemyの人気コースが今なら1,200円から!!

【Java入門】フォルダ・ファイル削除処理(再帰)

【Java入門】フォルダ・ファイル削除処理(再帰)

Java

public static void main(String[] args) {

    // 削除したいフォルダを指定
    Path target = Paths.get("C:\\workspace\\targetDir");

    try {
        // フォルダを削除
        deleteDirectory(target);
    } catch (IOException e) {

        System.out.println("削除失敗");
    }
}

/**
* フォルダ削除処理(指定したフォルダ自体も削除される)
* @param target
* @throws IOException
*/
private static void deleteDirectory(Path target) throws IOException  {

    Files.walk(target)
    .sorted(Comparator.reverseOrder())
    .map(Path::toFile)
    .peek(System.out::println)
    .forEach(File::delete);
}
  • .peek(System.out::println)とすることで、削除対象の一覧を確認することができます。

指定したフォルダ内のすべてのフォルダ・ファイルを削除(再帰)

指定したフォルダ内に存在するすべてのサブフォルダ・ファイルを削除します。
自身は削除されずに残るので、空フォルダになるサンプルです。

Java

public static void main(String[] args) {
    // 削除したいフォルダを指定
    Path target = Paths.get("C:\\workspace\\targetDir");

    try {
        // フォルダ内を削除
        deleteDirectory(target);
    } catch (IOException e) {

        System.out.println("削除失敗");
    }
}

/**
* フォルダ削除処理(指定したフォルダ自体は残り、空フォルダとなる)
* @param target
* @throws IOException
*/
private static void deleteDirectory(Path target) throws IOException  {

    Files.walk(target)
    .sorted(Comparator.reverseOrder())
    .filter(p -> p != target)
    .map(Path::toFile)
    .peek(System.out::println)
    .forEach(File::delete);
}
  • .filter(p -> p != target)とすることで、自身は削除対象にならないようにしています。
  • .peek(System.out::println)とすることで、filterの結果、つまり削除対象の一覧を確認することができます。

指定したフォルダ内の任意の拡張子を持つファイルを削除(再帰)

.txtを指定してテキストファイルだけを削除する例です。
もし、zipファイルだけ削除したい場合は.zipとすることで実現できます。 再帰処理なのでサブフォルダ内のファイルも削除できます。 ただし、元々存在する空フォルダや、ファイルを削除したことで空フォルダになってしまったフォルダは削除されずに残ります。

削除前のフォルダの状態がこちらです。

C:\workspace\targetDir>DIR /S /B

C:\workspace\targetDir\subDir
C:\workspace\targetDir\subDir2
C:\workspace\targetDir\subDir3
C:\workspace\targetDir\text01.txt
C:\workspace\targetDir\text02.txt
C:\workspace\targetDir\subDir\text03.txt
C:\workspace\targetDir\subDir\text04.txt
C:\workspace\targetDir\subDir\text04.zip
C:\workspace\targetDir\subDir\新しいフォルダー
C:\workspace\targetDir\subDir2\text01.txt
C:\workspace\targetDir\subDir2\text02.txt

削除後のフォルダの状態がこちらです。
subDirフォルダとsubDir2フォルダからテキストファイルが削除されていることを確認できます。

C:\workspace\targetDir>DIR /S /B

C:\workspace\targetDir\subDir
C:\workspace\targetDir\subDir2
C:\workspace\targetDir\subDir3
C:\workspace\targetDir\subDir\text04.zip
C:\workspace\targetDir\subDir\新しいフォルダー

ソースは以下のとおりです。

Java

public static void main(String[] args) {
    // 削除したいフォルダを指定
    Path target = Paths.get("C:\\workspace\\targetDir");
    String extention = ".txt";

    try {
        // 指定したフォルダから指定した拡張子を持つファイルを削除
        deleteFileExtentionOnly(target, extention);
    } catch (IOException e) {

        System.out.println("削除失敗");
    }
}

/**
* ファイル削除処理(指定した拡張子を持つファイルのみ削除する)
* @param target
* @param extension
* @throws IOException
*/
private static void deleteFileExtentionOnly(Path target, String extension) throws IOException  {

    Files.walk(target)
    .sorted(Comparator.reverseOrder())
    .filter(p -> p.toString().endsWith(extension))
    .map(Path::toFile)
    .peek(System.out::println)
    .forEach(File::delete);
}
  • .filter(p -> p.toString().endsWith(extension))とすることで、指定した拡張子を持つファイルのみが削除対象になります。
  • .peek(System.out::println)とすることで、filterの結果、つまり削除対象の一覧を確認することができます。

任意の拡張子を持つファイルを削除したことによって空フォルダが発生した場合にそれも削除

元々存在するフォルダや、ファイルを削除したことで空フォルダになってしまったフォルダを削除したい需要を実現するためのサンプルです。

削除前のフォルダの状態がこちらです。

C:\workspace\targetDir>DIR /S /B

C:\workspace\targetDir\subDir
C:\workspace\targetDir\subDir2
C:\workspace\targetDir\subDir3
C:\workspace\targetDir\text01.txt
C:\workspace\targetDir\text02.txt
C:\workspace\targetDir\subDir\text03.txt
C:\workspace\targetDir\subDir\text04.txt
C:\workspace\targetDir\subDir\text04.zip
C:\workspace\targetDir\subDir\新しいフォルダー
C:\workspace\targetDir\subDir2\text01.txt
C:\workspace\targetDir\subDir2\text02.txt

削除後のフォルダの状態がこちらです。
subDirフォルダはテキストファイルを削除してもzipファイルが残るので、フォルダ自体が削除されませんが、 subDir2フォルダはテキストファイルを削除すると自身が空フォルダになるので削除されています。 また、subDir3新しいフォルダーは元々空フォルダであったため削除されています。

C:\workspace\targetDir>DIR /S /B

C:\workspace\targetDir\subDir
C:\workspace\targetDir\subDir\text04.zip

ソースは以下のとおりです。

Java

public static void main(String[] args) {
    // 削除したいディレクトリを指定
    Path target = Paths.get("C:\\workspace\\targetDir");
    String extention = ".txt";

    try {
        // 指定したディレクトリから指定した拡張子を持つファイルを削除
        deleteFileExtentionOnly(target, extention);
    } catch (IOException e) {

        System.out.println("削除失敗");
    }
}

/**
* ファイル削除処理(指定した拡張子を持つファイルのみ削除する)
* ファイルを削除したことによって空フォルダが生じた場合、それも削除対象になる
* @param target
* @param extension
* @throws IOException
*/
private static void deleteFileExtentionOnly(Path target, String extension) throws IOException  {

    //filterのメイン処理
    Predicate<? super Path> delTarget = p -> {

        // 空ディレクトリは削除対象とする。
        if (Files.isDirectory(p)){
            try {
                return Files.list(p).count() == 0;
            } catch (Exception e) {
                System.out.println("検知失敗");
            }
        }

        // 指定した拡張子を持つファイルは削除対象とする。
        return p.toString().endsWith(extension);
    };

    Files.walk(target)
    .sorted(Comparator.reverseOrder())
    .filter(delTarget)
    .map(Path::toFile)
    .peek(System.out::println)
    .forEach(File::delete);
}
  • filter(delTarget)とすることで、削除対象のフォルダ・ファイルの判定をdelTargetの中で記述することができます。

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です