指定したフォルダ内に存在するすべてのサブフォルダ・ファイルを削除して、自身も削除するサンプルです。
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がオススメ!同僚に差をつけよう!