質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

519閲覧

特定の拡張子ファイルを削除後に、ディレクトリが空だったらフォルダを消したい

hedgehogs

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/09/26 13:34

前提

Javaを勉強中です。
再帰処理の勉強をしている中で、問題がとけません。

実現したいこと

特定のファイル拡張子”.xlsx”と".jfif"を含むファイルのみ削除した後に、ディレクトリが空だったら削除をしたい。

該当のソースコード

メインコード

java

1import java.io.File; 2 3public class Recursion { 4 public static void main(String[] args) { 5 String filePath = "C:\\Work\\aaa"; 6 File target = new File(filePath); 7 recurse(target); 8 9 } 10 11 private static void recurse(File target) { 12 File[] files = target.listFiles(); 13 for (File file : files) { 14 if (file.isDirectory()) { 15 16 System.out.println("D:" + file.getName()); 17 recurse(file); 18 19 } else { 20 // ファイル名の取得 21 String fileName = file.getName(); 22 // 三項演算子で拡張子がある場合=trueの場合は拡張子、ない場合=falseは空文字を返す 23 String extension = (fileName.lastIndexOf(".") != -1) ? fileName.substring(fileName.lastIndexOf(".")):""; 24 25 // 拡張子に".xlsx"または".jfif"を含むファイルを削除 26 if (".xlsx".equals(extension) || ".jfif".equals(extension)) { 27 file.delete(); 28 //ファイルが存在しなければ削除 29 if (!(file.exists())) { 30 file.delete(); 31 32 } 33 34 } 35 36 } 37 38 39 40 System.out.println("F:" + file.getName()); 41 } 42 43 } 44 45}

txt

1C:\Work\aaa\a1.txt 2C:\Work\aaa\a2.txt 3C:\Work\aaa\bbb 4C:\Work\aaa\bbb\b1.txt 5C:\Work\aaa\bbb\ccc 6C:\Work\aaa\bbb\ccc\zzz.jfif 7C:\Work\aaa\bbb\zzz.jfif 8C:\Work\aaa\ppp.xlsx 9C:\Work\aaa\yyy 10C:\Work\aaa\yyy\xxx 11C:\Work\aaa\yyy\xxx\zzz.jfif 12C:\Work\aaa\yyy\zzz.jfif 13C:\Work\aaa\zzz 14C:\Work\aaa\zzz\ppp.xlsx 15C:\Work\aaa\zzz\z1.txt 16C:\Work\aaa\zzz.jfif

試したこと

特定の拡張子を削除するコードを記述したあとに、ファイルの存在をチェックするif文をかきました。そしてファイルが存在しなければディレクトリを削除しようとしています。
特定の拡張子のファイルは消せるのですが、空になったディレクトリが消せません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/09/26 13:56

もしや //ファイルが存在しなければ削除 if (!(file.exists())) { file.delete(); } でディレクトリを削除する処理のつもりでしょうか。 file は何を指しているのか、冷静に考えてください。
guest

回答1

0

ベストアンサー

このような問題はテスト環境(ディレクトリやファイル)を毎回準備するのが面倒ですので、その準備もプログラムにやらせるのが吉です。

java

1import java.io.*; 2 3public class Recursion { 4 public static void main(String[] args) throws IOException { 5 File target = new File("aaa"); 6 createFiles(target); 7 printFiles(target); 8 System.out.println("========"); 9 recurse(target, (dir,name) -> name.endsWith(".xlsx") || name.endsWith(".jfif")); 10 System.out.println("========"); 11 printFiles(target); 12 13 //片付け 14 //System.out.println("--------"); 15 //recurse(target, (dir,name) -> true); 16 //target.delete(); 17 } 18 19 private static void printFiles(File target) { 20 File[] files = target.listFiles(); 21 for(File file : files) { 22 if(file.isDirectory()) { 23 System.out.println("Directory: " + file); 24 printFiles(file); 25 } else { 26 System.out.println("File: " + file); 27 } 28 } 29 } 30 31 private static void createFiles(File target) throws IOException { 32 target.mkdir(); 33 new File(target, "a1.txt").createNewFile(); 34 new File(target, "a2.txt").createNewFile(); 35 new File(target, "bbb").mkdir(); 36 new File(target, "bbb\\b1.txt").createNewFile(); 37 new File(target, "bbb\\ccc").mkdir(); 38 new File(target, "bbb\\ccc\\zzz.jfif").createNewFile(); 39 new File(target, "bbb\\zzz.jfif").createNewFile(); 40 new File(target, "ppp.xlsx").createNewFile(); 41 new File(target, "yyy").mkdir(); 42 new File(target, "yyy\\xxx").mkdir(); 43 new File(target, "yyy\\xxx\\zzz.jfif").createNewFile(); 44 new File(target, "yyy\\zzz.jfif").createNewFile(); 45 new File(target, "zzz").mkdir(); 46 new File(target, "zzz\\ppp.xlsx").createNewFile(); 47 new File(target, "zzz\\z1.txt").createNewFile(); 48 new File(target, "zzz.jfif").createNewFile(); 49 } 50 51 private static void recurse(File target, FilenameFilter filter) { 52 File[] files = target.listFiles(); 53 for(File file : files) { 54 if(file.isDirectory()) { 55 System.out.println("Directory: " + file); 56 recurse(file, filter); 57 if(file.list().length == 0) { 58 System.out.println("Delete: " + file); 59 file.delete(); 60 } 61 } else if(filter.accept(file.getParentFile(), file.getName())) { 62 System.out.println("Delete: " + file); 63 file.delete(); 64 } 65 } 66 } 67}

実行結果

plain

1File: aaa\a1.txt 2File: aaa\a2.txt 3Directory: aaa\bbb 4File: aaa\bbb\b1.txt 5Directory: aaa\bbb\ccc 6File: aaa\bbb\ccc\zzz.jfif 7File: aaa\bbb\zzz.jfif 8File: aaa\ppp.xlsx 9Directory: aaa\yyy 10Directory: aaa\yyy\xxx 11File: aaa\yyy\xxx\zzz.jfif 12File: aaa\yyy\zzz.jfif 13Directory: aaa\zzz 14File: aaa\zzz\ppp.xlsx 15File: aaa\zzz\z1.txt 16File: aaa\zzz.jfif 17======== 18Directory: aaa\bbb 19Directory: aaa\bbb\ccc 20Delete: aaa\bbb\ccc\zzz.jfif 21Delete: aaa\bbb\ccc 22Delete: aaa\bbb\zzz.jfif 23Delete: aaa\ppp.xlsx 24Directory: aaa\yyy 25Directory: aaa\yyy\xxx 26Delete: aaa\yyy\xxx\zzz.jfif 27Delete: aaa\yyy\xxx 28Delete: aaa\yyy\zzz.jfif 29Delete: aaa\yyy 30Directory: aaa\zzz 31Delete: aaa\zzz\ppp.xlsx 32Delete: aaa\zzz.jfif 33======== 34File: aaa\a1.txt 35File: aaa\a2.txt 36Directory: aaa\bbb 37File: aaa\bbb\b1.txt 38Directory: aaa\zzz 39File: aaa\zzz\z1.txt

投稿2022/09/26 14:34

編集2022/09/27 03:32
jimbe

総合スコア12644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問