我尝试了一千多次,我无法找到一种方法将所有文件路径作为字符串返回,仅作为列表。例如,我希望名为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。
提前致谢。
答案 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文件本身等等。 击>