使用Java删除具有相同前缀字符串的文件

时间:2011-08-30 08:26:06

标签: java filenames java-io

我在目录中有大约500个文本文件,其文件名前缀为dailyReport_

文件的后半部分是文件的日期。 (例如。dailyReport_08262011.txtdailyReport_08232011.txt

我想使用Java程序删除这些文件(我可以使用shell脚本并在crontab中添加一个作业,但该应用程序应该由外行使用)。

我可以使用类似的东西删除一个文件

        try{
          File f=new File("dailyReport_08232011.txt");
          f.delete();
        }
        catch(Exception e){ 
                System.out.println(e);
        }

但是我可以删除具有特定前缀的文件(例如:dailyReport08第8个月)我可以使用rm -rf dailyReport08*.txt轻松地在shell脚本中执行此操作。

但是File f=new File("dailyReport_08*.txt");在Java中不起作用(如预期的那样)。

现在在Java 中没有运行循环可以在目录中搜索文件吗?

我可以使用类似于shell脚本中使用的*的一些特殊字符来实现此目的吗?

11 个答案:

答案 0 :(得分:38)

不,你不能。 Java是一种相当低级的语言 - 与shell脚本相比 - 所以这样的事情必须更加明确地完成。您应该使用folder.listFiles(FilenameFilter)搜索具有所需掩码的文件,并迭代返回的数组,删除每个条目。像这样:

final File folder = ...
final File[] files = folder.listFiles( new FilenameFilter() {
    @Override
    public boolean accept( final File dir,
                           final String name ) {
        return name.matches( "dailyReport_08.*\\.txt" );
    }
} );
for ( final File file : files ) {
    if ( !file.delete() ) {
        System.err.println( "Can't remove " + file.getAbsolutePath() );
    }
}

答案 1 :(得分:28)

您可以使用循环

for (File f : directory.listFiles()) {
    if (f.getName().startsWith("dailyReport_")) {
        f.delete();
    }
}

答案 2 :(得分:8)

使用Java 8:

Parse.Cloud.define("testCloudCode", function(request, response) 
{
    var parametersPassed = request.params.username;
    var requestBody =  request.requestBody;
    console.log("___________________________________________________");
    console.log(requestBody);
    console.log(parametersPassed);
    console.log("___________________________________________________");
    response.success("Yay need to fix push NOTIFICATIONs");
});

简单版本:

public static boolean deleteFilesForPathByPrefix(final String path, final String prefix) {
    boolean success = true;
    try (DirectoryStream<Path> newDirectoryStream = Files.newDirectoryStream(Paths.get(path), prefix + "*")) {
        for (final Path newDirectoryStreamItem : newDirectoryStream) {
            Files.delete(newDirectoryStreamItem);
        }
    } catch (final Exception e) {
        success = false;
        e.printStackTrace();
    }
    return success;
}

根据需要修改Path / String参数。您甚至可以在文件和路径之间进行转换。对于Java&gt; = 8,首选路径。

答案 3 :(得分:4)

像这样使用FileFilter

File dir = new File(<path to dir>);
File[] toBeDeleted = dir.listFiles(new FileFilter() {
  boolean accept(File pathname) {
     return (pathname.getName().startsWith("dailyReport_08") && pathname.getName().endsWith(".txt"));
  } 

for (File f : toBeDeleted) {
   f.delete();
}

答案 4 :(得分:3)

没有通配符,但您可以实施FilenameFilter并使用startsWith("dailyReport_")检查路径。然后调用File.listFiles(filter)为您提供一个文件数组,您可以循环并调用delete()。

答案 5 :(得分:3)

我知道我迟到了。但是,为了将来参考,我想提供一个不涉及循环的java 8 stram解决方案。

可能不太漂亮。我欢迎建议让它看起来更好。但是,它完成了这项工作:

Files.list(deleteDirectory).filter(p -> p.toString().contains("dailyReport_08")).forEach((p) -> {
    try {
        Files.deleteIfExists(p);
    } catch (Exception e) {
        e.printStackTrace();
    }
});

或者,您可以使用 Files.walk ,它将遍历目录深度优先。也就是说,如果文件埋在不同的目录中。

答案 6 :(得分:2)

Java 8:

Route::bind('product', function ($slug, $route) {
    $color = $route->parameter('color');

    return Product::where([
        'slug'  => $slug,
        'color' => $color,
    ])->first() ?? abort(404);
});

答案 7 :(得分:1)

如果没有循环,你就无法做到。但是你可以增强这个循环。首先,问你一个问题:“在循环中搜索和删除有什么问题?”如果由于某种原因它太慢,你可以在一个单独的线程中运行你的循环,这样它就不会影响你的用户界面。

其他建议 - 将您的每日报告放在一个单独的文件夹中,然后您就可以删除包含所有内容的此文件夹。

答案 8 :(得分:1)

我同意BegemoT。

然而,只有一个优化: 如果您需要一个简单的FilenameFilter,那么Google套餐中就有一个类。 因此,在这种情况下,您甚至不必创建自己的匿名类。

import com.google.common.io.PatternFilenameFilter;

final File folder = ...
final File[] files = folder.listFiles(new PatternFilenameFilter("dailyReport_08.*\\.txt"));

// loop through the files
for ( final File file : files ) {
    if ( !file.delete() ) {
        System.err.println( "Can't remove " + file.getAbsolutePath() );
    }
}

享受!

答案 9 :(得分:0)

查看Apache FileUtils,它提供了许多方便的文件操作。

答案 10 :(得分:0)

new java.io.File(<<pathStr>>).listFiles.filter(_.getName.endsWith(".txt")).foreach(_.delete())