1. 程式人生 > >檔案 File 遞迴 複製 字尾名 目錄 字串解析 MD

檔案 File 遞迴 複製 字尾名 目錄 字串解析 MD

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱

檔案 File 遞迴複製 修改後綴名 生成Markdown目錄 字串解析 MD

目錄

使用方式

工具類的作用:生成GitHub上廠庫MyAndroidBlogsREANME.MD中部落格的目錄。

方式一
不修改檔案內容:

  • 通過為知筆記匯出指定目錄下的所有檔案,匯出為U8格式的純文字
  • 通過 MDUtils.modifyFileSuffix 遞迴修改檔案的字尾名,同時刪除不匹配的檔案
  • 通過TOCUtils.insertToc方法遞迴給 markdown 檔案新增目錄
  • 通過 MDUtils.getFormatFilesNames 獲取格式化目錄,並將內容複製到貼上板
  • 將貼上板中的內容貼上到REANME.MD中就可以了
MDUtils.modifyFileSuffix(new File(DIR));
TOCUtils.insertToc(new File(DIR));
MDUtils.getFormatFilesNames(new File(DIR));

方式二
通過方式一操作之後發現有一個小問題,就是因為為知筆記裡面的空格實際上不是空格,而是一個特殊符號,這個符號放在GitHub中不起作用,比如:

System.out.println(" ".toCharArray()[0]+0);//160,MD中的空格
System.out.println(" ".toCharArray()[0]+0);//32,正常的空格

這就很坑爹了呀,這導致我幾乎所有的標籤都不能用了!
所以優化了上面的一點細節,只需將上面第二步由呼叫 MDUtils.modifyFileSuffix 改為呼叫 MDUtils.modifyFile 即可。這個方法除了會遞迴修改檔案的字尾名,並刪除不匹配的檔案外,同時還會修改檔案中的一些不太正常的字元

MDUtils.modifyFile(new File(DIR));
TOCUtils.insertToc(new File(DIR));
MDUtils.getFormatFilesNames(new File(DIR));

一些常量

private static final String DIR = "D:/為知筆記匯出/MyAndroidBlogs";
private static final String WEBSITE = "https://github.com/baiqiantao/MyAndroidBlogs/blob/master/";
private static final String FILTER = "MD";
private static final String SUFFIX_MD_TXT = ".md.txt";
private static final String SUFFIX_TXT = ".txt";
private static final String SUFFIX_MD = ".md";
private static final String SPACE = " ";
private static final String SPACE_FORMAT = "%20";
private static final String[] EXCLUDE_FILES = new String[]{".git", "README.md"};
private static final String[] REPLACE_STRINGS = new String[] { " " };//特殊字元
private static final String BLANK = " ";//空格

檔案目錄遞迴修改

遞迴修改檔案字尾名並修改檔案內容

/**
 * 遞迴修改檔案字尾名並修改檔案內容
 */
public static void modifyFile(File from) {
    if (from == null || !from.exists()) {
        throw new RuntimeException("源目錄或檔案不存在");
    }
    if (from.isFile()) {
        if (from.getName().contains(FILTER)) {//只處理帶指定標識的檔案
            copyAndModifyFileContent(from, new File(from.getParent(), getNewName(from)));
        }
        from.delete();//刪除原始檔
        return;
    }

    File[] listFiles = from.listFiles();
    if (listFiles == null || listFiles.length == 0) {
        System.out.println("----------------------" + from.getName() + "中不存在任何檔案");
        from.delete();//刪除空資料夾
        return;
    }

    for (File file : listFiles) {
        if (file.isDirectory()) {
            modifyFile(file);//遞迴
        } else if (file.isFile()) {
            if (file.getName().contains(FILTER)) {//只處理帶指定標識的檔案
                copyAndModifyFileContent(file, new File(file.getParent(), getNewName(file)));
            }
            file.delete();
        }
    }

    listFiles = from.listFiles();
    if (listFiles == null || listFiles.length == 0) {
        System.out.println("----------------------" + from.getName() + "的檔案全部不符合要求");
        from.delete();//刪除空資料夾
    }
}

遞迴修改檔案字尾名

/**
 * 遞迴修改檔案字尾名
 */
public static void modifyFileSuffix(File from) {
    if (from == null || !from.exists()) {
        throw new RuntimeException("源目錄或檔案不存在");
    }
    if (from.isFile()) {
        if (from.getName().contains(FILTER)) {//只處理帶指定標識的檔案
            from.renameTo(new File(from.getParent(), getNewName(from)));
        } else {
            from.delete();//刪除原始檔
        }
        return;
    }

    File[] listFiles = from.listFiles();
    if (listFiles == null || listFiles.length == 0) {
        System.out.println("----------------------" + from.getName() + "中不存在任何檔案");
        from.delete();//刪除空資料夾
        return;
    }

    for (File file : listFiles) {
        if (file.isDirectory()) {
            modifyFileSuffix(file);//遞迴
        } else if (file.isFile()) {
            if (file.getName().contains(FILTER)) {//只處理帶指定標識的檔案
                file.renameTo(new File(file.getParent(), getNewName(file)));
            } else {
                file.delete();
            }
        }
    }

    listFiles = from.listFiles();
    if (listFiles == null || listFiles.length == 0) {
        System.out.println("----------------------" + from.getName() + "的檔案全部不符合要求");
        from.delete();//刪除空資料夾
    }
}
/**
 * 獲取重新命名的檔名
 */
private static String getNewName(File file) {
    String name = file.getName();
    if (name.endsWith(SUFFIX_MD_TXT)) { //處理指定字尾的檔案
        name = name.substring(0, name.indexOf(SUFFIX_MD_TXT) + SUFFIX_MD.length());
    } else if (name.endsWith(SUFFIX_TXT)) {
        name = name.substring(0, name.indexOf(SUFFIX_TXT)) + SUFFIX_MD;
    }
    return name;
}

遞迴獲取格式化後的檔名

/**
 * 獲取指定目錄及其子目錄下的檔案的檔名,並對檔名進行格式化,並存儲到一個指定的集合中,並將內容複製到貼上板
 */
public static List<String> getFormatFilesNames(File from) {
    List<String> filePathList = new ArrayList<>();
    getDirFormatFilesNames(filePathList, from, 0);
    StringBuilder sBuilder = new StringBuilder();
    for (String string : filePathList) {
        System.out.print(string);
        sBuilder.append(string);
    }
    setSysClipboardText(sBuilder.toString());
    return filePathList;
}
/**
 * 遞迴獲取指定目錄及其子目錄下的檔案的檔名,並對檔名進行格式化,並存儲到一個指定的集合中
 *
 * @param filePathList 將結果儲存到指定的集合中
 * @param from         要遍歷的目錄
 * @param curLeval     記錄當前遞迴所在層級
 */
private static void getDirFormatFilesNames(List<String> filePathList, File from, int curLeval) {
    if (from == null || !from.exists()) {
        throw new RuntimeException("源目錄或檔案不存在");
    } else if (isExcludeFile(from.getName())) {
        System.out.println("----------------------" + "忽略檔案" + from.getName());
        return;
    } else {
        filePathList = filePathList == null ? new ArrayList<String>() : filePathList;
        filePathList.add(getTitle(curLeval, from));
    }

    curLeval++;
    File[] files = from.listFiles();
    if (files == null || files.length == 0) {
        System.out.println("----------------------" + from.getName() + "中不存在任何檔案");
        return;
    }

    for (File file : files) {
        if (file.isDirectory()) {
            getDirFormatFilesNames(filePathList, file, curLeval);//遞迴
        } else if (file.isFile() && !isExcludeFile(file.getName())) {
            filePathList.add(getTitle(curLeval, file));
        }
    }
}
/**
 * 判斷是否是忽略的檔案
 */
private static boolean isExcludeFile(String fileName) {
    for (String name : EXCLUDE_FILES) {
        if (name.equals(fileName)) {
            return true;
        }
    }
    return false;
}

檔案複製

遞迴複製目錄下的所有檔案

/**
 * 遞迴複製目錄下的所有檔案
 */
public static void copyFiles(File from, File to) {
    if (from == null || !from.exists() || to == null) {
        throw new RuntimeException("原始檔或目標檔案不存在");
    }
    if (from.equals(to)) {
        System.out.println("----------------------原始檔和目標檔案是同一個" + from.getAbsolutePath());
    }

    if (from.isDirectory()) {
        if (to.isFile()) {
            throw new RuntimeException("目錄不能複製為檔案");
        }
        if (!to.exists()) {
            to.mkdirs();//建立目錄
        }
    } else {
        if (to.isDirectory()) {
            throw new RuntimeException("檔案不能複製為目錄");
        }
        copyFile(from, to);//檔案的話直接複製
        return;
    }

    File[] files = from.listFiles();
    if (files == null || files.length == 0) {
        System.out.println(from.getName() + "中不存在任何檔案");
        return;
    }

    for (File file : files) {
        if (file.isDirectory()) {
            File copyDir = new File(to, file.getName());
            if (!copyDir.exists()) {
                copyDir.mkdirs();
                System.out.println("建立子目錄\t\t" + copyDir.getAbsolutePath());
            }
            copyFiles(file, copyDir);//遞迴
        } else if (file.getName().contains(FILTER)) {
            copyFile(file, new File(to, file.getName()));
        }
    }
}

複製一個檔案或一個目錄

/**
 * 複製一個檔案或一個目錄(不會遞迴複製目錄下的檔案)
 */
public static void copyFile(File from, File to) {
    if (from == null || !from.exists() || to == null) {
        throw new RuntimeException("原始檔或目標檔案不存在");
    }
    if (from.equals(to)) {
        System.out.println("----------------------原始檔和目標檔案是同一個" + from.getAbsolutePath());
    }

    if (from.isDirectory()) {
        if (to.isFile()) {
            throw new RuntimeException("目錄不能複製為檔案");
        }
        if (!to.exists()) {
            to.mkdirs();//建立目錄
        }
        return; //沒有下面的劉操作
    } else {
        if (to.isDirectory()) {
            throw new RuntimeException("檔案不能複製為目錄");
        }
        if (!to.getParentFile().exists()) {
            to.getParentFile().mkdirs(); //複製父目錄
        }
    }

    try {
        BufferedInputStream bufis = new BufferedInputStream(new FileInputStream(from));
        BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream(to));
        int ch;
        while ((ch = bufis.read()) != -1) {
            bufos.write(ch);
        }
        bufis.close();
        bufos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

複製一個檔案並修改檔案內容

/**
 * 複製一個檔案或目錄(不會複製目錄下的檔案),複製的時候會修改檔案中的一些內容
 */
public static void copyAndModifyFileContent(File from, File to) {
    if (from == null || !from.exists() || to == null) {
        throw new RuntimeException("原始檔或目標檔案不存在");
    }
    if (from.equals(to)) {
        System.out.println("----------------------原始檔和目標檔案是同一個" + from.getAbsolutePath());
    }

    if (from.isDirectory()) {
        if (to.isFile()) {
            throw new RuntimeException("目錄不能複製為檔案");
        }
        if (!to.exists()) {
            to.mkdirs();//建立目錄
        }
        return; //沒有下面的劉操作
    } else {
        if (to.isDirectory()) {
            throw new RuntimeException("檔案不能複製為目錄");
        }
        if (!to.getParentFile().exists()) {
            to.getParentFile().mkdirs(); //複製父目錄
        }
    }

    try {
        BufferedReader bufr = new BufferedReader(new FileReader(from));
        BufferedWriter bufw = new BufferedWriter(new FileWriter(to));
        String line;
        //另外開闢一個緩衝區,儲存讀取的一行資料,返回包含該行內容的字串,不包含換行符,如果已到達流末尾,則返回【 null】
        while ((line = bufr.readLine()) != null) {
            for (String string : REPLACE_STRINGS) {
                line = line.replace(string, BLANK);//替換為空格
            }
            bufw.write(line);
            bufw.write(BLANK + BLANK);//加兩個空格
            bufw.newLine();// 寫入一個行分隔符
            bufw.flush();
        }
        bufr.close();
        bufw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

其他工具方法

將字串複製到剪下板

/**
 * 將字串複製到剪下板
 */
public static void setSysClipboardText(String writeMe) {
    Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable tText = new StringSelection(writeMe);
    clip.setContents(tText, null);
}

生成格式化的 Markdown 目錄

/***
 * 格式化目錄
 */
private static String getTitle(int level, File file) {
    StringBuilder sb = new StringBuilder();
    StringBuilder parentPath = new StringBuilder();
    File parent = file;
    for (int x = 1; x < level; x++) {
        sb.append("\t");
        parent = parent.getParentFile();//逐級獲取父檔案
        parentPath.insert(0, parent.getName() + "/");//在前面插入父檔案的檔名
    }

    sb.append("-").append(" ")//無序列表
            .append("[")//超連結顯示的字元
            .append(file.getName().endsWith(SUFFIX_MD) ? file.getName().substring(0, file.getName().lastIndexOf(SUFFIX_MD)) : file.getName())//
            .append("]")//
            .append("(")//拼接超連結
            .append(WEBSITE)//字首
            .append(parentPath.toString())//父目錄
            .append(file.getName().replaceAll(SPACE, SPACE_FORMAT))//檔名
            .append(")")//
            .append("\n");
    return sb.toString();
}

生成 Markdown 的目錄

用到的常量

private static final String HEADER_STRING = "#";
private static final char HEADER_CHAR = '#';
private static final String TOC_TITLE = "";//在目錄前插入的內容
private static final String REPLACE_TOC = "[TOC]"; //目錄要替換的內容
private static final String HEADER_1 = "="; //一級目錄
private static final String HEADER_2 = "--"; //二級目錄

private static final String PATTERN = "%s- [%s](#%s)";//標題的格式
private static final String SPACES = " ";
private static final String CODES = "%([abcdef]|\\d){2,2}";
private static final String SPECIAL_CHARS = "[\\/?!:\\[\\]`.,()*\"';{}+=<>~\\$|#]";
private static final String DASH = "-";
private static final String EMPTY = "";
private static final String AFFIX = "\t";

遞迴為檔案生成Markdown目錄

/**
 * 遞迴為檔案生成Markdown目錄
 */
public static void insertToc(File from) {
    if (from == null || !from.exists()) {
        throw new RuntimeException("源目錄或檔案不存在");
    }
    if (from.isFile()) {
        insertTocIntoFile(from, from, REPLACE_TOC, Integer.MAX_VALUE);
        return;
    }

    File[] listFiles = from.listFiles();
    if (listFiles == null || listFiles.length == 0) {
        System.out.println("----------------------" + from.getName() + "中不存在任何檔案");
        return;
    }

    for (File file : listFiles) {
        if (file.isDirectory()) {
            insertToc(file);//遞迴
        } else if (file.isFile()) {
            insertTocIntoFile(file, file, REPLACE_TOC, Integer.MAX_VALUE);
        }
    }
}
/**
 * 為檔案生成Markdown目錄
 */
public static void insertTocIntoFile(File from, File to, String replaceAt, int deepLevel) {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(new FileInputStream(from)));
        String line;//當前行的內容
        String previousLine = null;
        List<String> contentList = new ArrayList<>();//每一行的內容集合
        List<String> titleList = new ArrayList<>();//標題集合
        int currentLine = 0;
        int patternLineNumber = 1; //目錄插在那一行

        while ((line = reader.readLine()) != null) {
            ++currentLine;
            boolean skipLine = false;
            String trimLineString = line.trim();
            if (trimLineString.startsWith(HEADER_STRING)) { //檢測到標題
                int count = getCharCount(trimLineString, HEADER_CHAR);
                if (count < 1 || count > deepLevel) { //層級控制
                    System.out.println("----------------------------超過最大層級 " + deepLevel);
                    previousLine = line;
                    continue;
                }
                String headerName = trimLineString.substring(count).trim(); //去掉層級後的文字
                titleList.add(getTitle(count, headerName));
            } else if (line.startsWith(HEADER_1) && isNotEmpty(previousLine) && line.replaceAll(HEADER_1, "").isEmpty()) {
                titleList.add(getTitle(1, previousLine));
            } else if (line.startsWith(HEADER_2) && isNotEmpty(previousLine) && line.replaceAll(HEADER_2, "").isEmpty()) {
                titleList.add(getTitle(2, previousLine));
            } else if (patternLineNumber <= 1 && line.trim().equals(replaceAt)) {
                patternLineNumber = currentLine; //找到這個字串時就插在這一行(替換這個字串),找到之後就不再繼續找了
                skipLine = true;//忽略這一行
            }
            if (!skipLine) {
                contentList.add(line);
            }
            previousLine = line;
        }
        closeStream(reader); //必須先關掉這個讀取,流才能開啟寫入流

        if (patternLineNumber <= 0) {
            System.out.println("----------------------------目錄插入位置有誤");
            return;
        }

        contentList.add(patternLineNumber - 1, TOC_TITLE);//在指定位置插入目錄前面的標題
        for (String title : titleList) {
            contentList.add(patternLineNumber, title);
            patternLineNumber++;
        }
        writeFile(to, contentList);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        closeStream(reader);
    }
}
/**
 * 寫內容到指定檔案
 */
private static void writeFile(File to, List<String> contentList) {
    PrintWriter writer = null;
    try {
        writer = new PrintWriter(new FileWriter(to));
        for (String string : contentList) {
            writer.append(string).append("\n");
        }
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        closeStream(writer);
    }
}

插入的目錄格式

/**
 * 插入的目錄的模型
 */
private static String getTitle(int deepLevel, String headerName) {
    StringBuilder title = new StringBuilder();
    if (deepLevel > 1) {
        for (int i = 0; i < deepLevel - 1; i++) {
            title.append(AFFIX);
        }
    }

    String headerLink = headerName.trim()//
            .replaceAll(SPACES, DASH)//替換特殊字元,比如必須將空格換成'-'
            .replaceAll(CODES, EMPTY)//
            .replaceAll(SPECIAL_CHARS, EMPTY).toLowerCase();

    title.append(DASH).append(SPACES)//格式為【%s- [%s](#%s)】或【縮排- [標題][#連結]】
            .append("[").append(headerName).append("]")//
            .append("(").append("#")//
            .append(headerLink)//
            .append(")");
    return title.toString();
}

其他一些用到的工具方法

/**
 * 關閉流
 */
public static void closeStream(Closeable... closeable) {
    for (Closeable c : closeable) {
        if (c != null) {
            try {
                c.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
/**
 * 計算字串中字元的個數
 */
private static int getCharCount(String string, char c) {
    int count = 0;
    for (int i = 0; i < string.length(); i++) {
        if (string.charAt(i) == c) {
            ++count;
        } else {
            break;
        }
    }
    return count;
}
/**
 * 獲取檔案行數
 */
public static int getFileLines(File file) {
    LineNumberReader reader = null;
    try {
        reader = new LineNumberReader(new FileReader(file));
        reader.skip(Long.MAX_VALUE);
        return reader.getLineNumber() + 1;
    } catch (IOException ignored) {
    } finally {
        closeStream(reader);
    }
    return -1;
}
/**
 * 判斷字串非空
 */
public static boolean isNotEmpty(String string) {
    return string != null && !string.isEmpty();
}

2018-10-24

附件列表

相關推薦

檔案 File 複製 字尾 目錄 字串解析 MD

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 檔案 File 遞迴複製 修改後綴名 生成Markdown目錄 字串解析 MD 目錄 使用方式 工具類的作用:生成GitHub上廠庫MyAndroidBlogs的REANME.MD

複製整個資料夾下的檔案(無限複製子資料夾)

//複製資料夾 public bool CopyDirectory(string srcdir = "", string desdir = "", bool result = false) { try

C# -- 使用列出資料夾目錄目錄下的檔案

使用遞迴列出資料夾目錄及目錄的下檔案 1.使用遞迴列出資料夾目錄及目錄下檔案,並將檔案目錄結構在TreeView控制元件中顯示出來。 新建一個WinForm應用程式,放置一個TreeView控制元件:   程式碼實現:在Form_load的時候,呼叫遞迴方法載入檔案目錄結構在TreeVi

Linux高階程式設計基礎——檔案系統程式設計之遍歷/home目錄

檔案系統程式設計之遞迴遍歷/home目錄 /編寫程式完成以下功能: 1.遞迴遍歷/home目錄,打印出所有檔案和子目錄名稱及節點號。 2.判斷檔案型別,如果是子目錄,繼續進行遞迴遍歷,直到遍歷完所有子目錄為止。/ #include <stdio.h> #include &

Python學習筆記之遍歷目錄檔案和walk())

python中遍歷指定目錄下所有的檔案和資料夾,包含多級目錄,有兩種方法,一種是通過遞迴思想去遍歷,另一種是os模組的walk()函式 要列出目錄結構 一.遞迴方法 #coding:utf-8 import os a

目錄檔案輸出

#include <stdio.h> #include <stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<unist

php佇列方式和方式遍歷目錄檔案及子目錄

如果目錄很多,推薦佇列方式,遞迴方式會慢,慢的原因:遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做地址儲存,引數傳遞等 <?php   //遞迴方式 function read_dir($dir){       $fil

Java實現輸入任意目錄,列出檔案以及資料夾

import java.io.File; import java.util.ArrayList; import java.util.Scanner; public class IOPractice { public static ArrayList&l

--- 遍歷指定目錄下所有檔案

A、如果該檔案目錄下全是檔案(非資料夾),那很理想,直接列印絕對路徑(file.getAbsolutePath())就完成任務 B、重點在於如果該檔案目錄下有的是檔案,有的是資料夾(子資料夾)

python中的目錄的建立和目錄及其下的檔案的刪除

1,刪除目錄data下的train及其下的所有檔案,相當於linux中的rm -rf import shutil shutil.rmtree('data/train') 2,遞迴的建立目錄data/train,相當於Linux中的 mkdir -p import os os

perl 地遍歷目錄下的檔案

#!/usr/bin/perl -w use strict; use File::Spec; local $\ ="\n";#當前模組的每行輸出加入換行符 my %options;

[Linux C]遍歷指定目錄下的子目錄和檔案

/* 功能:演示了在Linux下利用C語言遞迴遍歷指定目錄下的子目錄(不含隱藏目錄)和檔案 */ #include <stdio.h> #include <dirent.h> #include <string.h> void List

將PC端的apk檔案通過微信檔案分享到手機,字尾有.1

在PC端下載apk檔案,通過微信檔案分享傳到手機端,在手機微信上可以看到此時傳過來的檔案後面多了.1的字尾,導致不能安裝 怎樣在手機檔案管理中找到這個檔案,並修改其後綴名,每次找路徑都要找半天,今天找好了,記錄一下,方便下次查詢。 華為Honor V10手機,路徑:本地->內部儲

C++ 和JAVA遍歷刪除目錄

JAVA: import java.io.File; public class DeleteDirectory {     /**      * 刪除空目錄      * @param dir 將要刪除的目錄路徑      */     private static vo

java 呼叫自動讀取某資料夾下所有檔案呼叫)

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; public cl

棧---定義、應用(字尾表示式實現數學表示式求值)

一、定義 棧是限定僅在表尾進行插入和刪除操作的線性表。因此,棧的表尾端稱為棧頂;表頭端稱為棧底。不含任何資料元素的棧稱為空棧。棧又稱為後進先出(Last In First Out)的線性表,簡稱LIF0結構。 理解棧的定義需要注意:首先它是一個線性表,也即棧

JAVA 一個簡單的檔案寫入程式碼(遍歷資料夾獲取所有檔案、寫入緩衝池、獲取檔案絕對路徑、按字尾過濾檔案

JAVA  一個簡單的檔案寫入程式碼(遍歷資料夾獲取所有檔案、寫入緩衝池、獲取檔案絕對路徑、按字尾名過濾檔案) package com.test; /*  * vika 11-14  * 將固定資料夾中的固定格式的檔案的絕對路徑寫入一個txt檔案中  */ import

qt中獲取檔案路徑和檔名、字尾

QString file_full, file_name, file_path,file_suffix ; QFileInfo fileinfo; file_full = QFileDialog::getOpenFileName(this,.....); fileinfo =

IO流複製資料夾以及資料夾中的內容---師承劉意老師

package copyfloder; /* * 分析 * 1.建立目標資料夾 * 2.判斷原始檔夾是資料夾還是檔案 * a,是資料夾在目標資料夾建立新的資料夾在執行2 * b,是檔案直接將檔案複

java使用POI實現excel檔案的讀取,相容字尾xls和xlsx

首先,引入所需的jar包: 如果是maven管理專案的jar包,只需在pom.xml中加上: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency>