我想在目录和嵌套子目录中找到所有txt
个文件。如果找到,我想将其从一个位置移动到另一个位置。
如果我没有任何嵌套的子目录,以下代码可以正常工作。
以下代码的问题是,一旦找到嵌套目录,它就只从该特定的嵌套子目录返回该文件。
但是我想要目录中的所有txt
文件(父文件及其嵌套的子目录)。
public class FilesFindingInDirectory {
static ArrayList<File> al = new ArrayList<File>();
static File fileLocation = null;
public static void main(String[] args) throws IOException {
File filePath = new File("C:\\Users\\Downloads");
File[] listingAllFiles = filePath.listFiles();
ArrayList<File> allFiles = iterateOverFiles(listingAllFiles);
for (File file : allFiles) {
if(file != null) {
String fileName = file.getName();
String sourceFilepath = file.getAbsolutePath();
File targetFilePath = new File("D:\\TestFiles");
String targetPath = targetFilePath.getPath();
Files.move(Paths.get(sourceFilepath), Paths.get("D:\\TestFiles\\" + fileName));
}
}
}
public static ArrayList<File> iterateOverFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
iterateOverFiles(file.listFiles());// Calls same method again.
} else {
fileLocation = findFileswithTxtExtension(file);
if(fileLocation != null) {
System.out.println(fileLocation);
al.add(fileLocation);
}
}
}
return al;
}
public static File findFileswithTxtExtension(File file) {
if(file.getName().toLowerCase().endsWith("txt")) {
return file;
}
return null;
}
}
答案 0 :(得分:5)
您已经在使用nio Files API移动文件,为什么不使用它来迭代文件?
List<Path> txtFiles = Files.walk(Paths.get("C:\\Users\\Downloads"))
//use to string here, otherwise checking for path segments
.filter(p -> p.toString().endsWith(".txt"))
.collect(Collectors.toList());
如果您不需要该中间列表,您也可以在foreach
终端操作中运行您的移动操作
Files.walk(Paths.get("C:\\Users\\Downloads"))
.filter(p -> p.toString().endsWith(".txt"))
.forEach(p -> {
try {
Files.move(p, Paths.get("D:\\TestFiles", p.getFileName().toString()));
} catch (IOException e) {
e.printStackTrace();
}
});
答案 1 :(得分:3)
从你的递归函数中删除这一行:
return al;
将此行更改为仅调用递归函数:
ArrayList<File> allFiles = iterateOverFiles(listingAllFiles);
到
iterateOverFiles(listingAllFiles);
最后改变你的for循环迭代静态字段al。
for (File file : allFiles) {
到
for (File file : al) {
说明:有很多方法可以为此问题编写递归。在这种情况下,您有一个用于收集结果的全局变量。每次迭代都应该添加到该全局结果中,然后返回。在所有递归调用结束时,全局变量将包含所有结果。
答案 2 :(得分:1)
您正在以递归方式正确调用该函数,但是您将忽略其返回值。相反,您应该将其附加到结果列表:
public static List<File> iterateOverFiles(File[] files) {
List<File> result = new ArrayList<>();
for (File file : files) {
if (file.isDirectory()) {
result.addAll(iterateOverFiles(file.listFiles()); // Here!
} else {
fileLocation = findFileswithTxtExtension(file);
if(fileLocation != null) {
result.add(fileLocation);
}
}
}
return result;
}
答案 3 :(得分:0)
只需遍历目录,跳过任何非目录条目和没有所需扩展名的条目。将具有正确扩展名的所有文件添加到结果中,并为每个目录递归执行。
public class FilesFindingInDirectory {
public static void main(String[] args) throws IOException {
File filePath = new File("C:\\Users\\Downloads");
Collection<File> allFiles = findFiles(filePath, ".txt");
allFiles.forEach(file -> {
String fileName = file.getName();
String sourceFilepath = file.getAbsolutePath();
File targetFilePath = new File("D:\\TestFiles");
String targetPath = targetFilePath.getPath();
Files.move(Paths.get(sourceFilepath), Paths.get("D:\\TestFiles\\" + fileName));
}
}
}
public static List<File> findFiles(File dir, String extension) {
File[] files = dir.listFiles(f -> f.isDirectory() || f.getName().toLowerCase().endsWith(extension);
ArrayList<File> result = new ArrayList<>();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
result.addAll(findFiles(file, extension);
} else {
result.add(file);
}
}
return result;
}
}