如何进入给定目录中的每个子文件夹并从那里获取pdf文件,如同收集所有子文件夹中的所有pdf并移动到公共文件夹?
我尝试过以下失败的代码。
import java.io.File;
import java.io.IOException;`enter code here`
import java.nio.file.Files;
import java.util.ArrayList;
public class PDFMover{
/**
* @param args
* @return
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File mainfolder = new File("C:\\Users\\myuser\\Desktop\\X\\Report");
File[] fulllist = mainfolder.listFiles();
ArrayList<String> listofpath = new ArrayList<String>(fulllist.length);
for (File x : fulllist)
{
if (x.isDirectory())
{
System.out.println("Directory:" +x.getName());
}
else
{
System.out.println("Notfound");
}
}
String source = "C:\\Users\\myuser\\Desktop\\X\\Report";
String destination ="C:\\Users\\myuser\\Desktop\\Destination";
File f1 = new File(source);
File f2 = new File(destination);
for (File x : fulllist)
{
if(mainfolder.isDirectory())
{
Files.copy(f1.toPath(), f2.toPath());
}
}
}
}
答案 0 :(得分:0)
如果你使用nio.Files解决方案来查找每个子目录中的每个文件:
import java.nio.file.FileSystems;
import java.nio.file.Files;
public class FileWalker
{
public static final String PATH = "C:\\Users\\myuser\\Desktop\\X\\Report";
public static void main(final String[] args) throws Exception
{
Files.walk(FileSystems.getDefault()
.getPath((PATH)))
.map(path -> path.getFileName())
.filter(name -> name.toString()
.toLowerCase()
.endsWith("pdf"))
.forEach(System.out::println);
}
}
而不是System.out.println,你必须复制文件。
答案 1 :(得分:0)
您可以使用递归函数,也可以使用显式堆栈来执行此操作。您只需检查每个文件,看它们是否符合您的选择标准。如果没有,如果它是一个目录,你把它放在堆栈中继续前进。
这是使用这种方法的一些工作代码。它让你找到具有特定扩展名的文件,直到特定的递归深度。 getRecurseFiles()返回规范路径字符串列表。
import java.util.*;
import java.io.*;
class Tracker {
File[] list;
int depth;
public Tracker (File[] l, int d) {
this.list = l;
this.depth = d;
}
}
public class RecTraverse {
public static int MAX_DEPTH = 10;
List<String> getRecurseFiles (String dir) throws IOException {
List<String> requiredFiles = new ArrayList<>();
Stack<Tracker> rstack = new Stack<>();
File[] list = new File(dir).listFiles();
rstack.push(new Tracker(list, 1));
while (!rstack.empty()) {
Tracker tmp = rstack.pop();
for (int i=0; i<tmp.list.length; i++) {
File thisEntry = tmp.list[i];
String fileName = tmp.list[i].getCanonicalPath();
if (thisEntry.isFile()) {
int j = fileName.lastIndexOf('.');
if (j > 0) {
String extension = fileName.substring(j+1).toLowerCase();
if (extension.equals("pdf"))
requiredFiles.add(tmp.list[i].getCanonicalPath());
}
} else {
System.out.println(thisEntry.getCanonicalPath());
File[] thisEntryList = thisEntry.listFiles();
if (thisEntryList != null && tmp.depth+1 <= MAX_DEPTH) {
rstack.push(new Tracker(thisEntryList, tmp.depth+1));
}
}
}
}
return requiredFiles;
}
public static void main (String[] arg) {
try {
List<String> l = new RecTraverse().getRecurseFiles(".");
for (String s : l)
System.out.println(s);
} catch (IOException e) {
}
}
}