使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希

Posted

技术标签:

【中文标题】使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希【英文标题】:Read Meta and an MD5 Hash For Every File On the C Drive Using Java 【发布时间】:2017-06-25 13:32:23 【问题描述】:

我想知道是否有人可以帮助我。我只是在学习 Java,我想做的是读取 c:\ 上的每个文件并创建该文件的 md5 哈希以在稍后阶段进行比较以及显示一些基本计数和元数据。我似乎无法递归循环 c:\ 驱动器中的每个文件和文件夹,而且我不确定如何处理创建每个文件的 MD5 哈希。我也不确定这是处理这么多文件的最佳方法。

    public static void main(String[] args) throws IOException 
    int FileCount = 0,
        DirCount = 0,
        HiddenFiles = 0,
        HiddenDirs = 0;

    File folder = new File("/");
    File[] listOfFiles = folder.listFiles();

    for (File listOfFile : listOfFiles) 
        Path file = listOfFile.toPath();
        BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
        System.out.println("creationTime: " + attr.creationTime());
        System.out.println("lastAccessTime: " + attr.lastAccessTime());
        System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
        System.out.println("isOther: " + attr.isOther());
        System.out.println("isRegularFile: " + attr.isRegularFile());
        System.out.println("isSymbolicLink: " + attr.isSymbolicLink());
        System.out.println("size: " + attr.size());

        if (listOfFile.isFile()) 
            System.out.println("File " + listOfFile.getName());
            System.out.println("isHidden " + listOfFile.isHidden());

            if (listOfFile.isHidden()) 
                HiddenFiles++;
            

            System.out.println("getPath " + listOfFile.getPath());
            FileCount++;

         else if (listOfFile.isDirectory()) 
            System.out.println("Directory " + listOfFile.getName());
            System.out.println("isHidden " + listOfFile.isHidden());
            System.out.println("getPath " + listOfFile.getPath());

            if (listOfFile.isHidden()) 
                HiddenDirs++;
            

            DirCount++;
        

        System.out.println("DirCount " + DirCount);
        System.out.println("FileCount " + FileCount);
        System.out.println("HiddenDirs " + DirCount);
        System.out.println("HiddenFiles " + FileCount);
    

【问题讨论】:

【参考方案1】:

让我们创建可以做你想做的事的类:

File, Folder 

File 已经存在,让我们创建一个名为XFile 的类,虽然不好,但你会在未来找到更好的东西。

public class XFile 
    private final File file;

    public XFile(File file) 
        this.file = file;
    

    public String name() 
        return file.getName();
    

    //other data you want to know, create getters for all wanted information from File.

    public byte[] md5() 
        try (InputStream input = new BufferedInputStream(new FileInputStream(file))) 
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            int tempByte;
            while ((tempByte = input.read()) != -1) 
                md5.update((byte) tempByte);
            
            return md5.digest();
         catch (IOException | NoSuchAlgorithmException e) 
            throw new RuntimeException(e);
        

    

Folder 类(应该一直在 jdk 中)

public class Folder 
    private final File underlyingDir;
    private List<File> elements = null;

    public Folder(File underlyingDir) 
        this.underlyingDir = underlyingDir;
    

    private void fetchElements() 
        List<File> firstLevelElements = new ArrayList<>(Arrays.asList(underlyingDir.listFiles()));
        elements = this.recursive(firstLevelElements, Integer.MAX_VALUE);
    

    public List<XFile> files() 
        if (elements == null) 
            fetchElements();
        
        return elements.stream()
                .filter(File::isFile)
                .map(XFile::new)
                .collect(Collectors.toList());
    

    public long foldersCount() 
        if (elements == null) 
            fetchElements();
        
        return elements.stream()
                .filter(File::isDirectory)
                .collect(Collectors.toList())
                .size();
    

    public long filesCount() 
        if (elements == null) 
            fetchElements();
        
        return elements.stream()
                .filter(File::isFile)
                .collect(Collectors.toList())
                .size();
    

    public long hiddenFiles() 
        if (elements == null) 
            fetchElements();
        
        return elements.stream()
                .filter(File::isFile)
                .filter(File::isHidden)
                .collect(Collectors.toList())
                .size();
    

    public long hiddenDirs() 
        if (elements == null) 
            fetchElements();
        
        return elements.stream()
                .filter(File::isDirectory)
                .filter(File::isHidden)
                .collect(Collectors.toList())
                .size();
    

    private List<File> recursive(List<File> elements, int depth) 
        if (depth == -1) return Collections.emptyList();
        List<File> result = new ArrayList<>();
        for (File element : elements) 
            if (element.isDirectory()) 
                depth--;
                result.add(element);
                if (nonNull(element.listFiles())) 
                    result.addAll(recursive(Arrays.asList(element.listFiles()), depth));
                
             else 
                result.add(element);
            
        
        return result;
    

和测试类Main

    public class Main 

    public static void main(String[] args) 
        Folder folder = new Folder(new File("F:/"));
        System.out.println("files " + folder.filesCount());
        System.out.println("folders " + folder.foldersCount());
        System.out.println("hidden dirs " + folder.hiddenDirs());
        System.out.println("hidden files " + folder.hiddenFiles());

        for (XFile file : folder.files()) 
            System.out.printf("\nname: %s MD5 hash %s ", file.name(), Arrays.toString(file.md5()));
        
    

【讨论】:

以上是关于使用 Java 读取 C 驱动器上每个文件的元数据和 MD5 哈希的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException:在使用 Spring Boot 实现开放 API 时无法读取类的元数据

是否可以使用 UDF 从 BigQuery 读取 gcs 对象的元数据

linux下find查找文件后使用xargs和exec进行删除压缩处理。

java从xml读取数据更快还是从数据库里读取数据更快?

使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据

java无依赖读取Excel文件