在java中将filepath作为字符串获取

时间:2018-01-27 11:52:20

标签: java string filepath

我尝试了一千多次,我无法找到一种方法将所有文件路径作为字符串返回,仅作为列表。例如,我希望名为filePath的字符串返回c:/users/exampleuser/file.txt,但是对于目录中的所有文件及其子目录。

public void listFilesAndFilesSubDirectories(String directoryName){
     directoryName = "C:\\";
    File directory = new File(directoryName);
    //get all the files from a directory
    File[] fList = directory.listFiles();
    for (File files : fList){
        if (files.isFile()){
            System.out.println(files.getAbsolutePath());
        } else if (files.isDirectory()){
            listFilesAndFilesSubDirectories(files.getAbsolutePath());
        }
    }
}

这是我尝试的示例代码,但没有返回任何内容。我需要将filePaths作为字符串返回,因为我试图使用this方法获取md5。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Files以简单的方式实现它:

<?= Y::t('app', 'Все категории')?>

答案 1 :(得分:1)

删除第一行后,您的代码正常工作。然后它打印一个完整路径的文件列表。

如果您还想打印MD5总和,您只需从您引用的代码中选择相关部分即可。哪个不是太多,因为你已经在循环中有了File个对象,所以你需要使用md5的那一行:

public static void listFilesAndFilesSubDirectories(String directoryName){
    File directory = new File(directoryName);
    //get all the files from a directory
    File[] fList = directory.listFiles();
    for (File file : fList){
        if (file.isFile()){
            System.out.print(file.getAbsolutePath());
            try(FileInputStream fis=new FileInputStream(file)){
                System.out.println(" - MD5: "+DigestUtils.md5Hex(IOUtils.toByteArray(fileInputStream)));
            }catch(Exception ex){
                System.out.println(" - Error: "+ex);
            }
        } else if (file.isDirectory()){
            listFilesAndFilesSubDirectories(file.getAbsolutePath());
        }
    }
}

因为我不喜欢依赖外部库,特别是它将整个文件加载到内存中(toByteArray调用表明它),这里是第一个{{{ 1}},没有Apache Commons并且没有将整个文件加载到数组中,但需要if方法标题或额外的throws NoSuchAlgorithmException - try某处:

catch

或者是一个不会引发异常并且不依赖于... if (file.isFile()){ System.out.print(file.getAbsolutePath()); try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), MessageDigest.getInstance("MD5"))){ while(dis.read()>=0); System.out.println(" - MD5: "+javax.xml.bind.DatatypeConverter.printHexBinary(dis.getMessageDigest().digest())); }catch(Exception ex){ System.out.println(" - Error: "+ex); } } else if (file.isDirectory()){ ... 的东西(毕竟不一定存在)的长篇:

javax

以下是我用于测试的实际代码(... if (file.isFile()){ System.out.print(file.getAbsolutePath()); MessageDigest md5=null; try{md5=MessageDigest.getInstance("MD5");}catch(NoSuchAlgorithmException nsae){}; try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5)){ while(dis.read()>=0); System.out.print(" - MD5: "); for(Byte b: md5.digest()) System.out.printf("%02X",b); System.out.println(); }catch(IOException ioe){ System.out.println(" - Error: "+ioe); } } else if (file.isDirectory()){ ... ),现在已针对c:\进行了修改(其中包括处理您无权访问的目录的附加检查):

RecDir.java

我只是直接从NetBeans / Eclipse项目文件夹(这是硬编码的import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class RecDir { public static void main(String[] args) { listFilesAndFilesSubDirectories("c:\\"); } public static void listFilesAndFilesSubDirectories(String directoryName){ File directory = new File(directoryName); //get all the files from a directory File[] fList = directory.listFiles(); if(fList!=null) for (File file : fList){ if (file.isFile()){ System.out.print(file.getAbsolutePath()); MessageDigest md5=null; try{md5=MessageDigest.getInstance("MD5");}catch(NoSuchAlgorithmException nsae){}; try(DigestInputStream dis=new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5)){ while(dis.read()>=0); System.out.print(" - MD5: "); for(Byte b: md5.digest()) System.out.printf("%02x",b); System.out.println(); }catch(IOException ioe){ System.out.println(" - Error: "+ioe); } } else if (file.isDirectory()){ listFilesAndFilesSubDirectories(file.getAbsolutePath()); } } } } 结果)中运行它,然后它列出了子目录中的各种项目文件,.java文件本身等等。