0

このメソッドは、fileListで提供されているすべてのファイルと空のディレクトリを削除します。動作しているようです。再帰を使用して空のディレクトリを削除しますが、無限ループが発生するケースが心配です。このアプローチで考慮すべき考えや事柄はありますか?

public static void deleteFilesAndEmptyDirs(List<File> fileList) {
            boolean result = true;
            List<File> returnList = new LinkedList<File>();
            for (File file : fileList) {
                result = file.delete();
                if(result == false && file.isDirectory()) {
                    returnList.add(file);
                }
            }

            if(returnList.size() >= 1) {
                deleteFilesAndEmptyDirs(returnList);
            }
        }
4

2 に答える 2

1

空でないディレクトリが検出された場合、メソッドは無限に再帰します。空でないディレクトリの内容を、削除するファイルのリストに追加する必要があります。

以下のコードは再帰的なシンボリックリンクに対して堅牢であると私は信じています(ただしテストはしていません)。

public static void deleteFilesAndEmptyDirs(List<File> fileList) {
            boolean result = true;
            List<File> returnList = new LinkedList<File>();
            for (File file : fileList) {
                result = file.delete();
                if(result == false && file.isDirectory()) {
                  for ( File f : file . listFiles ( ) ) {
                    returnList.add(f);
                  }
                  returnList . add ( file ) ;
                }
            }

            if(returnList.size() >= 1) {
                deleteFilesAndEmptyDirs(returnList);
            }
        }
于 2012-04-09T17:42:20.133 に答える
1

Linux では、2 つのディレクトリ間に再帰リンクを作成できます。

たとえば、次の 2 つのディレクトリを作成しました。

$ ls -Rla
.:
total 24
drwxr-xr-x   4 dave dave  4096 2012-04-09 17:26 .
drwxr-xr-x 111 dave dave 12288 2012-04-09 17:25 ..
drwxr-xr-x   2 dave dave  4096 2012-04-09 17:27 dir1
drwxr-xr-x   2 dave dave  4096 2012-04-09 17:27 dir2

./dir1:
total 8
drwxr-xr-x 2 dave dave 4096 2012-04-09 17:27 .
drwxr-xr-x 4 dave dave 4096 2012-04-09 17:26 ..
lrwxrwxrwx 1 dave dave    8 2012-04-09 17:27 dir2 -> ../dir2/

./dir2:
total 8
drwxr-xr-x 2 dave dave 4096 2012-04-09 17:27 .
drwxr-xr-x 4 dave dave 4096 2012-04-09 17:26 ..
lrwxrwxrwx 1 dave dave    8 2012-04-09 17:27 dir1 -> ../dir1/

それから私はこれを行うことができます:

 $ cd dir1/dir2/dir1/dir2/dir1/dir2/dir1/

チェックしないと、スタックオーバーフローが発生します。

于 2012-04-09T16:29:19.670 に答える