第7题:分析以下需求,并用代码实现
(1)从键盘接收一个文件夹路径,统计该文件夹大小
(2)从键盘接收一个文件夹路径,删除该文件夹
(3)从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
(4)从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:
aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
aaa
bbb.txt
ccc.txt
ddd.txt
eee
fff.txt
ggg.txt
package com.itheima.day11.homwork;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
/**
* @author Eleven
* @version V1.0
* @package: com.itheima.day11.homwork
* @date 2021-10-14 19:33
*/
public class Exercise7 {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
while (true) {
System.out.println("=============文件操作系统=============");
System.out.println("1.查看文件大小");
System.out.println("2.删除文件夹");
System.out.println("3.复制文件夹");
System.out.println("4.查看文件夹内容");
System.out.println("5,退出");
System.out.println("请选择功能:");
String key = chooseFunction();
switch (key){
case "1":
// System.out.println("1.查看文件大小");
findSize();
break;
case "2":
// System.out.println("2.删除文件夹");
delete();
break;
case "3":
// System.out.println("3.复制文件夹");
copy();
break;
case "4":
// System.out.println("4.查看文件夹内容");
viewFile();
break;
case "5":
System.out.println("确认退出?(Y/N)");
if(confirm() == 'Y')
return;
}
}
}
private static void viewFile() {
System.out.println("请输入文件路径:");
String path = scanner.nextLine();
checkAllFiles(path,1);
}
private static void copy() {
System.out.println("请输入要复制的文件路径:");
String sPath = scanner.nextLine();
System.out.println("请输入要复制的目标路径:");
String dPath = scanner.nextLine();
try {
copyDirectory(sPath, dPath);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void delete() {
System.out.println("请输入文件路径:");
String path = scanner.nextLine();
deleteDirectory(path);
System.out.println("删除成功");
}
private static void findSize(){
System.out.println("请输入文件路径:");
String path = scanner.nextLine();
int size = Math.round(checkFileSize(path) / 1024.0 / 1024.0);
System.out.println( path +"大小为:" + size + "MB");
}
/**
*
* 创建时间:2021/10/15 9:04
* @author Eleven
* @return 返回用户选择的数字
*/
private static String chooseFunction() {
while (true) {
String s;
s = scanner.nextLine();
if(s.length() > 1) {
System.out.println("请输入一个字符");
}else {
if("1".equals(s) || "2".equals(s) || "3".equals(s) ||
"4".equals(s) || "5".equals(s)){
return s;
}else {
System.out.println("请输入数字1-5");
}
}
}
}
/**
* 接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印
* 创建时间:2021/10/14 21:35
*
* @param path 要查看的文件路径
* @param count 用于记录递归层级
* @author Eleven
*/
private static void checkAllFiles(String path,int count){
if (count < 1) throw new RuntimeException("count请输入大于等于1 的数字");
File file = new File(path);
File[] files = file.listFiles();
String s = "";
if (count == 1)
System.out.println(s + file.getName());
for (int i = 0; i < count; i++) {
s += "--";
}
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
System.out.println(s + f.getName());
checkAllFiles(f.getAbsolutePath(), ++count);
} else {
System.out.println(s + f.getName());
}
}
}
}
/**
* 复制文件/文件夹
* 创建时间:2021/10/14 19:56
*
* @param sPath 需要复制的文件/文件夹的路径
* @param dPath 复制文件的目标路径
* @author Eleven
*/
private static void copyDirectory (String sPath, String dPath) throws IOException {
//判断文件是否能够访问
File sFile = new File(sPath);
File dFile = new File(dPath);
File[] files = sFile.listFiles();
if (files == null) throw new RuntimeException("文件夹不存在或无法访问");
//判断目标文件夹是否存在,若不存在新建一个
File temp = new File(dFile, sFile.getName());
if (dFile.exists()) {
//判断目标文件夹内,是否存在源文件
if (temp.exists()) {
System.out.println("目标文件内已存在要复制的文件,是否覆盖?");
if (confirm() == 'N') return;
}
temp.mkdirs();
} else {
dFile.mkdirs();
}
//将目标文件夹的内容都复制到该目录下
dFile = temp;
//复制文件夹
for (File file : files) {
if (file.isDirectory()) {
dFile.mkdirs();
copyDirectory(file.getAbsolutePath(), dFile.getAbsolutePath());
} else {
//复制文件
copyFile(file, new File(dFile, file.getName()));
}
}
}
/**
* 创建时间:2021/10/14 21:31
*
* @param sFile 要复制的文件地址
* @param dFile 复制文件的目标地址
* @author Eleven
*/
private static void copyFile (File sFile, File dFile) throws IOException {
FileInputStream fis = new FileInputStream(sFile);
FileOutputStream fos = new FileOutputStream(dFile);
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
fis.close();
fos.close();
}
/**
* 创建时间:2021/10/14 20:20
*
* @return 返回一个字符'Y'或'N'
* @author Eleven
*/
private static char confirm () {
char c;
while (true) {
String quitStr = scanner.nextLine();
if (quitStr.length() > 1) {
System.out.println("请输入一个字符");
} else {
quitStr = quitStr.toUpperCase();
if ((c = quitStr.charAt(0)) == 'Y' || c == 'N')
return quitStr.charAt(0);
else
System.out.println("请输入Y或N");
}
}
}
/**
* 删除指定文件/文件夹
* 创建时间:2021/10/14 19:49
*
* @param path 需要删除的文件/文件夹的路径
* @author Eleven
*/
private static void deleteDirectory (String path){
File file = new File(path);
File[] files = file.listFiles();
//文件夹不存在或无法访问情况
if(files == null) throw new RuntimeException("文件夹不存在或无法访问");
for (File file1 : files) {
if (file1.isFile())
file1.delete();
else
deleteDirectory(file1.getAbsolutePath());
}
file.delete();
}
/**
* 统计文件夹大小
* 创建时间:2021/10/14 19:46
*
* @param path 需要查看的文件/文件夹的路径
* @return 文件/文件夹的大小,单位为字节
* @author Eleven
*/
private static long checkFileSize (String path){
long size = 0;
File file = new File(path);
File[] files = file.listFiles();
if (files != null) {
for (File file1 : files) {
if (file1.isFile()) {
size += file1.length();
} else {
size += checkFileSize(file1.getAbsolutePath());
}
}
}
return size;
}
}