在Java中复制Directory.GetFiles(String,String)

本文关键字:String GetFiles Directory Java 复制 | 更新日期: 2023-09-27 18:22:35

概述

我正在将一个简单的实用程序从C#移植到Java中,作为这项工作的一部分,我正在为我喜欢C#语义的项目编写一些辅助方法。一旦这种情况是CCD_ 1。

当前代码

import java.io.File;
import java.io.FilenameFilter;
public class Directory {
    public static String[] GetFiles(String path) {        
        File directory = new File(path);
    
         return directory.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) {
                return new File(dir, filename).isFile();
            }
        });
     }
}

问题

虽然上面的一切看起来都很好,并且复制了其中一个GetFiles重载,但我一直在思考如何最好地编写一个复制C#的Directory.GetFiles(String, String)功能的方法。

此方法应该采用path字符串和searchPattern,后者用于仅返回与该特定模式匹配的文件。

例如,以下各项都应该有效:

// Used to get all JavaScript files
Directory.GetFiles("~/Documents/", "*.js");
// Get all CSS files in the styles sub-folder.
Directory.GetFiles("~/Documents/", "styles/*.css"); 

在Java中复制Directory.GetFiles(String,String)

您可以通过在每个星号和问号之前放置一个句点来修改模式,然后将其用作正则表达式来确定应返回哪些文件。所以,你可以写一些类似的东西

public static String[] GetFiles(final String path, final String searchPattern) {
    final Pattern re = Pattern.compile(searchPattern.replace("*", ".*").replace("?", ".?"));
    return new File(path).list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return new File(dir, name).isFile() && re.matcher(name).matches();
        }
    });
}

以Adam Michalcin的答案为基础,我得出了以下结果(注意,这些方法返回一个绝对路径数组:

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Directory {
    public static String[] GetFiles(String path) {        
        File directory = new File(path);
        File[] matchingFiles = directory.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) {
                return new File(dir, filename).isFile();
            }
        });
        ArrayList<String> files = new ArrayList<String>();
        for (File file : matchingFiles) {
            files.add(file.getAbsolutePath());
        }
        return (String[])files.toArray(new String[files.size()]);
    }
    public static String[] GetFiles(String path, final String searchPattern) {
        // Split the searchPattern incase we have directories in there
        ArrayList<String> pattern = new ArrayList<String>(Arrays.asList(searchPattern.split("/")));
        // Take the last element out from the array, as this will be the file pattern
        String filePattern = pattern.remove(pattern.size() - 1);
        // Insert the base path into the remaining list
        pattern.add(0, path);
        // Now lets concat the lot to create a base path
        path = Path.combine((String[])pattern.toArray(new String[pattern.size()]));
        final Pattern regEx = Pattern.compile(filePattern.replace("*", ".*").replace("?", ".?"));
        File directory = new File(path);
        File[] matchingFiles = directory.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) {
                return new File(dir, filename).isFile() && regEx.matcher(filename).matches();
            }
        });
        ArrayList<String> files = new ArrayList<String>();
        for (File file : matchingFiles) {
            files.add(file.getAbsolutePath());
        }
        return (String[])files.toArray(new String[files.size()]);
    }
}

这还利用了我设置的另一个助手(Path.combine):

import java.io.File;
public class Path {
    public static String combine(String... paths)
    {
        File file = new File(paths[0]);
        for (int i = 1; i < paths.length ; i++) {
            file = new File(file, paths[i]);
        }
        return file.getPath();
    }
}

用法

Directory.GetFiles("/Users/beardtwizzle/", "/Documents/javascripts/*.js");

这仍然是布鲁诺·席尔瓦提到的另一个性格问题。所以我也会试着为它烤一个补丁。