我在目录中有大约500个文本文件,其文件名前缀为dailyReport_
。
文件的后半部分是文件的日期。 (例如。dailyReport_08262011.txt
,dailyReport_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脚本中使用的*
的一些特殊字符来实现此目的吗?
答案 0 :(得分:38)
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())