当我想使用Java删除存储库中的文件时,我遇到了问题。我想要做的是检查存储库是否存在,如果存在,我想删除它包含的所有文件。 这是我的代码:
File f = new File(this.pathToFolder);
if (f.exists() && f.isDirectory()) {
for (int i = 0; i < f.listFiles().length ; i++) {
f.listFiles()[i].delete();
}
}
else {
f.mkdir();
}
但问题是,有时它不会删除文件。我的猜测是,因为我要删除的文件有一个奇怪的标题,如:1.20.36579.55485875 它们是我下载的文件,我无法选择他们的名字。
现在我尝试了类似的东西:
File f = new File(this.pathToFolder);
if (f.exists() && f.isDirectory()) {
int i = 0;
while (f.listFiles().length != 0) {
boolean remove = f.listFiles()[i].delete();
System.out.println(remove);
}
}
else {
f.mkdir();
}
在控制台中我得到了很多&#34; false&#34; (约15)然后最终成为真实。
我不明白为什么会这样。也许你们中的一些人会有一个想法。
谢谢你, 瓦茨拉夫
答案 0 :(得分:2)
您的代码的问题在于您在删除文件时修改了listFiles()数组,因此每次循环时数组的大小都在缩小。
试试这个
for (File file : f.listFiles()) {
file.delete();
}
答案 1 :(得分:1)
你的第一个方法(for循环)的问题已经解决了。
关于你的第二种方法我猜了一下。当你进入下一次迭代时,我会假设(没有验证它)删除尚未完成。因此listFiles()[0]可能仍然与上一次迭代中的相同。
如果您的代码打印的输出行数(true为false)比目录中的文件更多,我认为我猜对了。
无论如何,Joakim Danielson建议的解决方案......
for (File file : f.listFiles()) {
file.delete();
}
...通过只调用一次listFiles()然后遍历生成的数组来解决这两个问题。
您可以通过稍微修改代码来实现相同的目标(以不太优雅的方式):
File f = new File(this.pathToFolder);
if (f.exists() && f.isDirectory()) {
File[] files = f.listFiles(); // calling listFiles only once ...
for (int i = 0; i < files.length ; i++) { // ... and then operating on the resulting array
files[i].delete();
}
}
else {
f.mkdir();
}
...未经测试 - 我希望我没有犯错。
用listFiles
的javadoc说:
无法保证结果数组中的名称字符串将以任何特定顺序出现;特别是,它们不会保证按字母顺序出现。
在处理目录时不会多次调用listFiles()的另一个好理由。
答案 2 :(得分:1)
尝试使用迭代器
迭代文件for (Iterator<File> it = Arrays.stream(f.listFiles()).iterator(); it.hasNext();) {
File file = it.next();
file.delete();
}