用户选择该选项时如何输出目录元哈希值?

时间:2018-07-05 11:50:46

标签: java hash

在这里,我需要我的程序输出3件事的哈希值:

  • 文件
  • 目录
  • 目录元

我已经使文件和目录正常工作,但是我只是不知道如何执行目录元哈希值。到目前为止,当用户进入目录并选择选项“ 2”时,将显示目录meta,但没有哈希值。所以我需要做的就是让程序输出目录meta的哈希值以及所有其他输出。我的代码如下所示:(首先感谢提供帮助的人)

主班

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Driver {

public static void main(String[] args) throws IOException {

    Scanner Scanscan = new Scanner(System.in);
    HashFunction hf = new HashFunction();
    System.out.println("Input File or Directory Path:");

    while(true) {
    String filename = Scanscan.nextLine();
    File inputFile = new File(filename);
    long hash = 0;
    if(filename.equals("exit")){


    if (inputFile.isFile()) {
        hash = hf.produceFileHash(inputFile.getAbsolutePath());

        System.out.println(String.format("The File Hash Value is: %016X", hash));   

    } else if (inputFile.isDirectory()) {
        System.out.println("Please choose either '1' - Directory Hash OR '2' - Directory Meta");
        String Choice = Scanscan.nextLine();
        if (Choice.equals("1")) {
            hash = hf.produceDirHash(inputFile.getAbsolutePath());
            System.out.println(String.format("The Directory Hash Value is: %016X", hash));
            //System.exit(0);

        } else if (Choice.equals("2")) {
            hash = hf.produceDirMetaHash(inputFile.getAbsolutePath());



        }

        }

    }

}

}
}

HashChecker类

public interface HashChecker {

long produceFileHash(String filename);

long produceDirHash(String path);

long produceDirMetaHash(String path);
}

HashFunction类

@Override
public long produceDirMetaHash(String path) {
    int FileCount = 0;
    File dirmeta = new File(path);
    File[] listOfFiles = dirmeta.listFiles();

    for (File listOfFile : listOfFiles) {
        Path file = listOfFile.toPath();
        BasicFileAttributes attr = null;
        try {
            attr = Files.readAttributes(file, BasicFileAttributes.class);
        } catch (IOException e) {

            e.printStackTrace();
        }
        if (listOfFile.isFile()) {
            FileCount++;
            System.out.println("\nFile Number: " + FileCount);
            System.out.println("File Name: " + listOfFile.getName());
            System.out.println("Path: " + listOfFile.getPath());
            System.out.println("Created: " + attr.creationTime());
            System.out.println("Last Accessed: " + attr.lastAccessTime());
            System.out.println("Last Modified: " + attr.lastModifiedTime());
            System.out.println("Regular File: " + attr.isRegularFile());
            System.out.println("Size: " + attr.size());

            System.out.println("File Name " + listOfFile.getName());
            System.out.println("Path " + listOfFile.getPath());
            FileCount++;
            System.out.println("File Number " + FileCount);
        }
    }
    return FileCount;
}
}

Example of the hash output i need but instead for directory meta

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法:

  1. 创建一个ByteArrayOutputStream
  2. ByteArrayOutputStream封装在ObjectOutputStream中。
  3. ObjectOutputStream中写入所有属性。
  4. 使用方法toByteArray()将所有属性转换为字节。
  5. 使用这些字节执行所需的任何哈希操作。例如,您可以使用Arrays#hashCode(…)作为最简单的解决方案,或者使用MessageDigest作为更好的解决方案。

对于FileTime类型,请使用toInstant()方法将其转换为Serializable