该程序删除给定节点下的所有文件和文件夹。
*编辑*
我在驱动器 K 上有以下“测试”目录结构:
Folder K:\garbage\
f_00000b (file)
f_00000f ( " )
f_0000b3 ( " )
dir1 [FOLDER]
Folder K:\garbage\dir1\
abc.pdf (file)
b12.pdf (file)
b36.pdf (file)
dir2 [FOLDER]
Folder K:\garbage\dir1\dir2\
A.pdf (file)
a1.pdf (file)
A2.pdf (file)
*结束编辑*
程序有效,因为我偶然发现了“try-with-resources”,这条线被所有 /////////////////////////////////////////////////////////////////////// .
import java.io.IOError;
import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class CreatingDirectories {
public static void main(String[] args) {
deleteEverythingBelowThisNode(Paths.get("K:/garbage/dir1/dir2"));
}
static void deleteAllFilesIn(String ps){
Path p = Paths.get(ps);
try ////////////////////////////////////////////////////////////////
(DirectoryStream<Path> paths = Files.newDirectoryStream(p)) /////
{ //////////////////////////////////////////////////////////////////
for(Path q: paths)
Files.delete(q);
}catch(NotDirectoryException e){
System.out.println("Not directory: " + p.toString() + "--" + e);
}catch(DirectoryNotEmptyException e){
System.out.println("Not empty: " + p.toString() + "--" + e);
}
catch(IOException e){
System.out.println("IO: " + p.toString() + "--" + e);
}
catch(IOError e){
System.out.println("IO ERROR: " + e);
}
}
static void deleteEverythingBelowThisNode(Path p){
String sep = p.getFileSystem().getSeparator();
ArrayList<String> pathPieces = new ArrayList<>() ;
String [] paths = new String[p.getNameCount()];
for(int i = 0 ; i < p.getNameCount() ; i++){
pathPieces.add(p.getName(i).toString());
paths[i] = p.getRoot().toString();
}
for(int i = 0; i < p.getNameCount() ; i++)
for(int k = 0; k <= i; k++)
paths[i] += pathPieces.get(k) + sep;
for(int k = p.getNameCount() - 1; k >= 0; k--)
deleteAllFilesIn(paths[k]);
}
}
我知道“尝试资源”是必要的:程序可以使用它,而不是没有它。
但我不明白为什么,也不知道它是如何解决我现在描述的原始问题的。
我最初将“资源”放在 try-block 上方,就像这样,这看起来很自然:
DirectoryStream<Path> paths = Files.newDirectoryStream(p);
try {
for...
除了如上所示移动那一行之外,程序结构其他方面相同,所有文件和子文件夹已成功从文件夹中删除,但DirectoryNotEmptyException
被抛出。Windows Explorer 确认程序因异常终止后目录为空。
为什么在空目录上抛出异常?
从马的口中,“try-with-resources 语句......声明......一个对象......在语句末尾关闭。”
关闭发生在语句的末尾,所以在循环的末尾。即使使用 try-with-resources 怎么没有发生异常?
就像现在一样,在遍历整个节点之后,它下面的所有内容都被删除了。
那么 try-with-resources 实际上做了什么来启用删除一个没有 try-with-resources 就无法删除的空文件夹?
这些似乎不是愚蠢的问题或微不足道的情况。
DirectoryNotEmptyException
无论如何都确实发生了,但是 try-with-resources 以某种方式处理了它?我不敢相信我在问这个问题,因为这看起来确实是一个愚蠢的问题,但究竟发生了什么让程序按预期运行呢?