package com.lxf;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class SearchFile {
// 当前步骤所在的路径
public static String filePath = "";
/**
* 显示根目录
*/
public static void showRoots() {
// 获取根目录所有File对象
File[] files = File.listRoots();
//打印所有的根目录
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
}
/**
* 获取手动输入的命令
*/
public static String getInputStr() {
// 定义一个空的字符串
String inputStr = "";
//BufferedReader获取输入流的字符对象
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("当前路径:" + filePath);
try {
// 获取控制台输入的语句
inputStr = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
// 将控制台输入的命令返回
return inputStr;
}
/**
* 获取当前路径所在的文件对象
*
* @param name 输入的文件名
*/
public static void getFile(String name) {
// 如果name为空直接提示并返回
if (name.equals("")) {
System.out.println("请输入操作命令!");
SearchFile.getFile(SearchFile.getInputStr());
}
// 获取操作语句
String operateStr = "";
// 获取操作的文件名
String fileName = "";
// 单独输入一单词如:dir、back、esc会报错,直接try catch解决
try {
operateStr = name.substring(0, name.indexOf(" "));
// 打印fileName测试语句
//System.out.println("operateStr=" + operateStr);
fileName = name.substring(name.indexOf(" ") + 1);
// 打印fileName测试语句
//System.out.println("fileName=" + fileName);
} catch (Exception e) {
// 将name直接赋值给operateStr
operateStr = name;
// 将name赋值为null
fileName = null;
}
File file = null;// 定义一个File对象的引用,用来接收当前的file对象
if ("back".equalsIgnoreCase(operateStr)) {// 如果输入的是back
file = new File(SearchFile.filePath);
file = file.getParentFile();// 获取上一级路径
if (file != null) {
SearchFile.filePath = file.getPath();// 获取上一级路径
} else {
// 回到根目录
SearchFile.filePath = "";
System.out.println("已经到了根目录,不能再回退了!");
// 如果文件不存在,显示根路径
SearchFile.showRoots();
}
} else if ("esc".equalsIgnoreCase(operateStr)) {
//退出程序
System.out.println("程序结束!");
System.exit(0);
} else if ("cd".equalsIgnoreCase(operateStr)) {
//进入目录
CD(fileName);
} else if ("crt".equalsIgnoreCase(operateStr)) {
//创建文件
CREATE(fileName);
} else if ("del".equalsIgnoreCase(operateStr)) {
//删除文件
DEL(fileName);
} else if ("dir".equalsIgnoreCase(operateStr)) {
//显示该文件夹下的所有文件和文件夹
Dir();
} else if ("listAllDir".equals(operateStr)) {
//展示本电脑所有的文件夹及文件
LSALL();
} else if ("md".equalsIgnoreCase(operateStr)) {
//创建文件夹
MD(fileName);
} else if ("rd".equalsIgnoreCase(operateStr)) {
//移除文件夹
RD(fileName);
} else {
// 命令操作不存在,提示重新输入
System.out.println("该命令操作不存在,请重新输入!");
}
// 递归
SearchFile.getFile(SearchFile.getInputStr());
}
/**
* 改变目录 进入输入的目录
* @param fileName
*/
public static void CD(String fileName) {
// 创建当前目录下的文件对象
File file1 = new File(filePath + File.separator + fileName);
// File file2=null;
if (file1.exists() && file1.isDirectory()) {
// 进入目录成功,修改当前所在的路径
if (filePath.equals("")) {
//filepath为空,直接将fileName赋值给filePath
filePath = fileName;
} else {
//filepath不为空,拼接路径
// File.separator:文件路径分割符
filePath = filePath + File.separator + fileName;
}
} else {
// 提示信息:不是文件夹或文件夹名不存在
System.out.println("输入不是文件夹或文件夹名不存在!请重新输入");
}
}
/**
* 根据文件名在此目录下创建文件
* @param fileName
*/
public static void CREATE(String fileName) {
// 创建一个空值文件对象
File file1 = null;
// 创建父路径的文件对象
File file2 = new File(filePath);
if ("".equals(SearchFile.filePath)) {
// 根目录下没选择情况下,报出提示信息,并退出到命令行
System.out.println("请选择根目录!");
// 打印根目录
SearchFile.showRoots();
} else {
if (fileName.equals("")) {// 如果文件名为空直接提示信息,退回到命令行
System.out.println("文件名为空,请重新输入!");
} else {
// 否则不是根目录,拿当前路径进行拼接
file1 = new File(SearchFile.filePath + File.separator + fileName);
if (!file2.isDirectory()) {
// 父路径不是文件夹无法创建,报出提示信息,并退出到命令行
System.out.println("无法在文件下创建文件,请选择目录!");
} else if (file1.exists()) {
// 文件已存在,无法继续创建,报出提示信息,并退出到命令行
System.out.println("该文件已存在,无法继续创建!");
} else {
// 创建文件
try {
file1.createNewFile();
// 创建文件成功,并退出到命令行
System.out.println("创建文件成功!");
} catch (IOException e) {
// 创建文件成功,报错出错信息,并退出到命令行
System.out.println("文件格式错误或其它原因,请重新创建!");
}
}
}
}
}
/**
* 根据文件名删除该目录下的文件
* @param fileName
*/
public static void DEL(String fileName) {
// 创建一个空值文件对象
File file1 = null;
if ("".equals(SearchFile.filePath)) {
// 根目录下没选择情况下,报出提示信息,并退出到命令行
System.out.println("请选择根目录!");
// 打印根目录
SearchFile.showRoots();
} else {
if (fileName.equals("")) {// 如果文件名为空直接提示信息,退回到命令行
System.out.println("文件名为空,请输入文件名重试");
} else {
// 否则不是根目录,拿当前路径进行拼接
file1 = new File(SearchFile.filePath + File.separator + fileName);
if (file1.exists() && file1.isDirectory()) {
// 父路径不是文件夹无法删除,报出提示信息,并退出到命令行
System.out.println("无法删除目录!");
} else if (file1.exists() && !file1.isDirectory()) {
// 文件存在且不是文件夹,删除该文件
file1.delete();
System.out.println("该文件已被成功删除!");
}
}
}
}
/**
* 显示本目录下所有兄弟目录和文件
*/
public static void Dir() {
// 新建当前路径的文件对象
File file = new File(filePath);
// 如果文件存在且为文件夹,直接展示文件夹下的内容
if (file.exists() && file.isDirectory()) {
showFiles(file);
}
}
/*
* 显示所有目录和文件
*/
public static void LSALL() {
// 获取电脑所有的根目录
File[] files = File.listRoots();
for (int i = 0; i < files.length; i++) {
// 将电脑所有的目录显示出来
listAllDir(files[i]);
}
}
/**
* 根据目录名 创建目录
* @param fileName
*/
public static void MD(String fileName) {
// 创建一个空值文件对象
File file1 = null;
// 创建父路径的文件对象
File file2 = new File(filePath);
if ("".equals(SearchFile.filePath)) {
// 根目录下没选择情况下,报出提示信息,并退出到命令行
System.out.println("请选择根目录!");
// 打印根目录
SearchFile.showRoots();
} else {
if (fileName.equals("")) {// 如果文件名为空直接提示信息,退回到命令行
System.out.println("文件目录名为空,请重新输入!");
} else {
// 否则不是根目录,拿当前路径进行拼接
file1 = new File(SearchFile.filePath + File.separator + fileName);
if (!file2.isDirectory()) {
// 父路径不是文件夹无法创建,报出提示信息,并退出到命令行
System.out.println("请在目录下创建!");
} else if (file1.exists() && file1.isDirectory()) {
// 文件已存在,无法继续创建,报出提示信息,并退出到命令行
System.out.println("该文件目录已存在,无法继续创建");
} else {
// 创建文件
file1.mkdirs();
// 创建文件成功,并退出到命令行
System.out.println("创建目录成功!");
}
}
}
}
/*
*根据输入的目录名,移除当前目录下的对应目录及其包含的所有文件夹及文件
*/
public static void RD(String fileName) {
// 创建一个空值文件对象
File file1 = null;
// 创建父路径的文件对象
File file2 = new File(filePath);
if (fileName.equals("")) {
// 如果文件名为空直接提示信息,退回到命令行
System.out.println("要删除的文件目录名为空,请重新输入!");
} else {
// 拿当前路径进行拼接,
file1 = new File(SearchFile.filePath + File.separator + fileName);
if (file1.exists() && file1.isDirectory()) { // 该文件夹存在
// 删除文件夹包括文件下的所有东西
deleteDir(file1);
//删除成功打印语句
System.out.println("删除该目录成功!");
} else {
// 父路径不是文件夹无法移除条件下的文件夹,报出提示信息,并退出到命令行
System.out.println("该目录下没有要删除的目标目录!");
}
}
}
/**
* 删除传入的文件夹下的所有东西
* @param file1
*/
private static void deleteDir(File file1) {
//列出该文件下的所有文件夹及文件
File[] files=file1.listFiles();
//判断该文件下是否有东西
if(files!=null&&files.length>0) {
//该目录下有文件夹或者文件
for (int i = 0; i < files.length; i++) {
//判断这个目录下的所有东西,文件夹--》递归,文件--》删除
//直到把所有的文件及文件夹删除
if(files[i].exists()&&!files[i].isDirectory()) {
files[i].delete();
}else if(files[i].exists()&&files[i].isDirectory()){
//删除该文件夹下的所有东西
deleteDir(files[i]);
file1.delete();
}
}
}else {
//判断file1是否存在
if(file1.exists()) {
file1.delete();
}
}
}
/**
* 将得到的File对象进行显示
*/
public static void showFiles(File file) {
if (file != null) {// 文件是否为空
if (file.exists()) {// 文件是否存在
if (file.isDirectory()) {// 是否是文件夹
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {// 是否为文件夹
System.out.println(files[i] + "\t文件夹");
} else {
System.out.println(files[i] + "\t文件");
}
}
} else {
System.out.println(file + "\t这个文件夹为空!");
}
} else {
System.out.println(file + "\t文件");
}
}
}
}
// 显示电脑所有的目录
public static void listAllDir(File file) {
// 如果文件存在,且为文件夹,就打印它下面所有的文件和目录
if (file.exists() && file.isDirectory()) {
// 打印它下面所有的文件和目录
showFiles(file);
//获取该文件夹下所有的文件和文件夹
File[] files = file.listFiles();
//判断该文件夹下是否有文件夹和文件
if(files!=null&&files.length>0) {
for (int i = 0; i < files.length; i++) {
//列出改文件下所有的文件夹和文件
//文件-->跳过。文件夹-->列出打印再判断
if(files[i].exists()&&files[i].isDirectory()) {
// 递归调用,将该目录下所有的文件和目录再传入函数
listAllDir(files[i]);
}
}
}
}
}
public static void main(String[] args) {
// 操作命令(直接使用):
//back(返回上一级)、esc(退出程序)
//dir(展示当前文件夹下的所有文件及目录)、listAllDir(展示电脑所有的文件及目录)
// cd(进入目录)、crt(创建文件)、del(删除文件)、
//md(创建目录)、rd(移除目录)");
// 请输入命令(命令+空格+文件名或文件夹)如:cd C:\
// 打印根目录
SearchFile.showRoots();
// 调用获取命令的函数
SearchFile.getFile(SearchFile.getInputStr());
}
}