删除文件(奇怪的扩展名)

时间:2018-05-27 20:14:08

标签: java file

当我想使用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)然后最终成为真实。

我不明白为什么会这样。也许你们中的一些人会有一个想法。

谢谢你, 瓦茨拉夫

3 个答案:

答案 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();
}