在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。本案例要求编写一个文件管理器,实现文件的批量操作。文件管理器具体功能要求如下: (1) 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。 (2) 用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。 (3) 用户输入指令3,代表“复制文件/目录”,此时需要用户输入源目录和目标目录,程序执行后会将源目录下的内容复制到目标目录下。 (4) 用户输入指令4,代表“删除文件/目录”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。 (5) 用户输入指令5,代表“退出”,即退出该系统。
时间: 2024-02-15 07:03:33 浏览: 75
文件批量管理工具
以下是使用 Java 代码实现您的需求:
```java
import java.io.*;
import java.nio.file.*;
import java.util.*;
public class FileManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String command = "";
while (!command.equals("5")) {
System.out.println("请选择要执行的操作:");
System.out.println("1. 指定关键字检索文件");
System.out.println("2. 指定后缀名检索文件");
System.out.println("3. 复制文件/目录");
System.out.println("4. 删除文件/目录");
System.out.println("5. 退出");
command = scanner.nextLine();
switch (command) {
case "1":
searchByKeyword(scanner);
break;
case "2":
searchBySuffix(scanner);
break;
case "3":
copyDir(scanner);
break;
case "4":
deleteDir(scanner);
break;
case "5":
System.out.println("已退出文件管理器");
break;
default:
System.out.println("输入指令无效,请重新输入");
break;
}
}
}
// 指定关键字检索文件
private static void searchByKeyword(Scanner scanner) {
System.out.println("请输入要检索的目录路径:");
String dirPath = scanner.nextLine();
System.out.println("请输入要检索的关键字:");
String keyword = scanner.nextLine();
File dir = new File(dirPath);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.getName().contains(keyword)) {
System.out.println(file.getAbsolutePath());
}
}
} else {
System.out.println("输入路径不是目录");
}
}
// 指定后缀名检索文件
private static void searchBySuffix(Scanner scanner) {
System.out.println("请输入要检索的目录路径:");
String dirPath = scanner.nextLine();
System.out.println("请输入要检索的后缀名,多个后缀名用逗号分隔:");
String suffix = scanner.nextLine();
String[] suffixArray = suffix.split(",");
File dir = new File(dirPath);
if (dir.isDirectory()) {
List<String> fileList = new ArrayList<>();
for (String s : suffixArray) {
String filter = "*" + s;
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + filter);
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir.toPath())) {
for (Path entry : stream) {
if (matcher.matches(entry.getFileName())) {
fileList.add(entry.toAbsolutePath().toString());
}
}
} catch (IOException | DirectoryIteratorException e) {
e.printStackTrace();
}
}
for (String file : fileList) {
System.out.println(file);
}
} else {
System.out.println("输入路径不是目录");
}
}
// 复制文件/目录
private static void copyDir(Scanner scanner) {
System.out.println("请输入源目录路径:");
String sourcePath = scanner.nextLine();
System.out.println("请输入目标目录路径:");
String targetPath = scanner.nextLine();
File sourceDir = new File(sourcePath);
File targetDir = new File(targetPath);
if (!sourceDir.exists()) {
System.out.println("源目录不存在");
return;
}
if (!targetDir.exists()) {
targetDir.mkdirs();
}
if (!targetDir.isDirectory()) {
System.out.println("目标目录路径无效");
return;
}
try {
copyDir(sourceDir, targetDir);
System.out.println("复制成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("复制失败");
}
}
private static void copyDir(File sourceDir, File targetDir) throws IOException {
if (sourceDir.isDirectory()) {
File[] files = sourceDir.listFiles();
for (File file : files) {
File targetFile = new File(targetDir, file.getName());
if (file.isDirectory()) {
targetFile.mkdir();
copyDir(file, targetFile);
} else {
Files.copy(file.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
}
}
// 删除文件/目录
private static void deleteDir(Scanner scanner) {
System.out.println("请输入要删除的文件/目录路径:");
String path = scanner.nextLine();
File file = new File(path);
if (!file.exists()) {
System.out.println("输入路径不存在");
return;
}
try {
deleteDir(file);
System.out.println("删除成功");
} catch (IOException e) {
e.printStackTrace();
System.out.println("删除失败");
}
}
private static void deleteDir(File file) throws IOException {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
deleteDir(f);
}
}
Files.delete(file.toPath());
}
}
```
该代码中,我们使用了 `File` 类和 `Files` 类来实现文件的检索、复制和删除操作。其中,检索时我们使用了 `PathMatcher` 类来实现根据后缀名检索文件的功能。复制和删除时,我们使用了递归方式来遍历目录及其子目录中的所有文件和文件夹,并进行相应的操作。同时,我们使用了 try-catch 语句处理了可能出现的异常。
阅读全文