/**
* 通过递归创建/打印目录树
*/
public class TestFile2 {
public static boolean createDirOrFile(File f,boolean file){
if (file){
if (f.isFile()){
return false;
//如果路径已存在 返回false创建操作未执行
}
File upper = f.getParentFile();
if (upper.isDirectory()){
//如果父目录存在则创建该文件
try {
f.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
createDir(upper);
//如果不存在父目录则调用 createDir()方法创建父目录 之后再创建文件
try {
f.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
}
//如果想创建的不是文件 file为false 即创建目录
//下面的语句不需要else括起来 如果file为true执行完上面语句已经return了不会向下执行
if (f.isDirectory()){
//判断目标目录是否存在
return false;
}
File upper = f.getParentFile();
if (upper.isDirectory()){
f.mkdir();
return true;
}
createDir(upper);
//同样判断父目录是否存在 存在即创建f目录 不存在则创建父目录之后再创建f
f.mkdir();
return true;
}
private static void createDir(File dir){
//该方法为类的方法static在类内部进行调用 不需要供外部使用 所以private 内部使用不需要查看结果 所以void
//因为createDirOrFile()方法内已经判定目录dir不存在了 这里不需要再次判断
File upperDir = dir.getParentFile();
if (upperDir.isDirectory()){
//判断这一层目录的父目录是否存在
//.exists()无法区分目录和文件 只要路径一致都会true
dir.mkdir();
}else{
createDir(upperDir);
//递归 如果父目录不存在则调用本方法创建父目录的父目录 如果还不存在则再往上一层创建 直到某一层判断父目录存在后创建子目录结束方法 前一层createDir()才继续向下进行
dir.mkdir();
}
}
public static void main(String[] args) {
File mp4 = new File("C:/abc/def/ghi/m.mp4");
System.out.println(createDirOrFile(mp4,true));
for (int i =1;i<5;i++){
createDirOrFile(new File("C:/abc/def/p"+i+".jpg"),true);
}
}
}
class TestFile3{
public static void printFileList(File f){
//打印文件/目录树
if (!f.exists()){
System.out.println("目标不存在");
}else {
printFileList(f,0);
}
}
private static void printFileList(File f,int n){
//private私有 外部通过printFileList(File f)调用 免得传n=0
for (int i = 0;i<n;i++){
System.out.print("-");
//用n来区分目录树的层级 每深入一层就多打印一个 "-"
}
System.out.println(f.getName());
File[] subList = f.listFiles();
//.listFiles() 如果f的路径 denote象征 一个目录 则返回包含该目录下所有文件的File[]数组 如果f不是目录则返回null 如果是空目录则返回File[0]
if (subList != null){
for (File subListFile:subList){
//for-each循环
printFileList(subListFile,n+1);
//递归 每深入一层都使n++ 下一层同样经过打印文件名、判断是否目录、是目录再深入一层 直到某一层是文件不执行printFileList方法并结束这一层
}
}
}
public static void main(String[] args) {
printFileList(new File("C:/abc"));
}
public static void printDirAndMp4(File f,int n){
if (f.isDirectory()||f.getName().toLowerCase().endsWith(".mp4")){
//忽略大小写 先全部变为小写 再匹配.mp4
for (int i = 0;i<n;i++){
System.out.print("-");
}
System.out.println(f.getName());
}
//如果不是目录或者mp4则不打印
File[] subList = f.listFiles();
//.listFiles()返回数组File[]
if (subList != null){
for (File subListFile:subList){
//遍历子目录
printDirAndMp4(subListFile,n+1);
//递归 逐层递进打印所有目录和mp4
}
}
}
public static void printJpgOnly(File f){
if (f.isDirectory()){
File[] subList = f.listFiles();
if (subList != null){
for (File subListFile:subList){
printJpgOnly(subListFile);
//递归
}
}
} else if (f.getName().toLowerCase().endsWith(".jpg")) {
//.endsWith() 路径字符串以.jpg结尾 即为jpg文件
System.out.println(f.getPath());
}
//如果既不是目录也不是jpg文件 跳过if和elif语句块结束方法
}
}