編程語言對比手冊-縱向版[-文件-]

人不該被語言束縛,咱們最重要的是思想。而思想絕對凌駕於語言之上。javascript

前言:

語言對比手冊是我一直想寫的一個系列:通過認真思考,我決定從縱向和橫行兩個方面
來比較Java,Kotlin,Javascript,C++,Python,Dart,六種語言。
縱向版按知識點進行劃分,總篇數不定,橫向版按語言進行劃分,共6篇。其中:html

Java基於jdk8
Kotlin基於jdk8
JavaScript基於node11.10.1,使用ES6+
C++基於C++14
Python基於Python 3.7.2
Dart基於Dart2.1.0
複製代碼

文件操做是做爲每一個編程語言必備的模塊,本文將看一下六種語言對文件的操做java


1、Java版

1.建立文件夾:G:/Out/language/java/應龍.txt

建立文件.png

/**
  * 建立文件
  *
  * @param path 文件路徑
  */
 private static void mkFile(String path) {
     File file = new File(path);//1.建立文件
     if (file.exists()) {//2.判斷文件是否存在
         return;
     }
     File parent = file.getParentFile();//3.獲取父文件
     if (!parent.exists()) {
         if (!parent.mkdirs()) {//4.建立父文件
             return;
         }
     }
     try {
         file.createNewFile();//5.建立文件
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

|-- 使用
String path = "G:/Out/language/java/應龍.txt";
mkFile(path);
複製代碼

2.寫入字符文件

寫入.png

/**
 * 字符流插入
 *
 * @param path    路徑
 * @param content 內容
 */
private static void writeStr(String path, String content) {
    File file = new File(path);
    FileWriter fw = null;   
    try {
        fw = new FileWriter(file);//建立字符輸出流 
        fw.write(content);//寫入字符串
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fw != null) {
                fw.close();//關流
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

|-- 使用
String path = "G:/Out/language/java/應龍.txt";
String content = "應龍----張風捷特烈\n" +
        "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
        "時逢雷霆風會雨,應乘扶搖化入雲。";
writeStr(path, content);
複製代碼

3.寫入字符文件並制定字符集

指定字符編碼寫入.png

/**
 * 使用字符編碼寫入
 * @param path 路徑
 * @param content 內容
 * @param encoding 編碼
 */
private static void writeStrEncode(String path, String content, String encoding) {
    OutputStreamWriter osw = null;
    try {
        FileOutputStream fos = new FileOutputStream(path);
        osw = new OutputStreamWriter(fos, encoding);
        osw.write(content);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (osw != null) {
                osw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

|-- 使用
 String pathGBK = "G:/Out/language/java/應龍-GBK.txt";
 String pathUTF8 = "G:/Out/language/java/應龍-UTF8.txt";
 mkFile(path);
 String content = "應龍----張風捷特烈\n" +
         "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
         "時逢雷霆風會雨,應乘扶搖化入雲。";
writeStrEncode(pathGBK, content, "GBK");
writeStrEncode(pathUTF8, content, "UTF-8");
複製代碼

4.讀取字符文件並制定字符集

讀取.png

/**
 * 讀取字符文件
 * @param path 路徑
 * @param encoding 編碼格式
 * @return 文件字符內容
 */
private static String readStrEncode(String path, String encoding) {
    InputStreamReader isr = null;
    try {
        FileInputStream fis = new FileInputStream(path);
        isr = new InputStreamReader(fis, encoding);
        StringBuilder sb = new StringBuilder();
        int len = 0;
        char[] buf = new char[1024];
        while ((len = isr.read(buf)) != -1) {
            sb.append(new String(buf, 0, len));
        }
       return sb.toString();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            if (isr != null) {
                isr.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

|-- 使用
String result = readStrEncode(pathUTF8, "UTF-8");
//String result = readStrEncode(pathUTF8, "GBK");
System.out.println(result);
複製代碼

5.文件操做

遍歷.png

|-- 遍歷language文件夾---------------------------------------------
/**
 * 掃描文件夾
 * @param dir 文件夾
 */
private static void scan(String dir) {
    File fileDir = new File(dir);
    File[] files = fileDir.listFiles();
    for (File file : files) {
        System.out.println(file.getAbsolutePath());
        if (file.isDirectory()) {
            scan(file.getAbsolutePath());
        }
    }
}

|-- 重命名-----------------------------------------------------------
String path = "G:/Out/language/java/應龍.txt";
File file = new File(path);
File dest = new File(file.getParent(), "應龍-temp.txt");
file.renameTo(dest);

|-- 獲取磁盤空間----------------------------------------------------
long space = dest.getUsableSpace();//獲取該磁盤可用大小
System.out.println(space * 1.f / 1024 / 1024 / 1024 + "G");//260.25247G
long freeSpace = dest.getFreeSpace();//同上
System.out.println(freeSpace * 1.f / 1024 / 1024 / 1024 + "G");//260.25247G
long totalSpace = dest.getTotalSpace();//獲取該磁盤總大小
System.out.println(totalSpace * 1.f / 1024 / 1024 / 1024 + "G");//316.00098G

|-- 修改日期-----------------------------------------------------
String time = new SimpleDateFormat("yyyy/MM/dd a hh:mm:ss ")
        .format(dest.lastModified());
System.out.println(time);

|--刪除文件-----------------------------------------------
dest.delete();//刪除文件
複製代碼

6.讀寫權限相關

|-- 寫相關
File fileUTF8 = new File(pathUTF8);
fileUTF8.setWritable(false);//不可寫
fileUTF8.setWritable(true);//可讀
fileUTF8.canWrite();//是否可寫--false

|-- 寫相關
fileUTF8.canRead();//是否可讀--true
fileUTF8.setReadable(false);//不可寫讀
fileUTF8.setReadable(true);//可讀
fileUTF8.setReadOnly();//只讀
複製代碼

2、Kotlin版

1.建立文件
/**
 * 建立文件
 *
 * @param path 文件路徑
 */
private fun mkFile(path: String) {
    val file = File(path)//1.建立文件
    if (file.exists()) {//2.判斷文件是否存在
        return
    }
    val parent = file.parentFile//3.獲取父文件
    if (!parent.exists()) {
        if (!parent.mkdirs()) {//4.建立父文件
            return
        }
    }
    try {
        file.createNewFile()//5.建立文件
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

|-- 使用
val path = "G:/Out/language/kotlin/應龍.txt"
mkFile(path)
複製代碼

2.寫入字符文件

挺爽的,簡潔明瞭。固然用java的api也是能夠的node

val content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
        "時逢雷霆風會雨,應乘扶搖化入雲。";
val file = File(path)
file.writeText(content)
複製代碼

3.寫入字符文件並制定字符集

Charset默認居然只有這幾個,但看一下源碼,能夠用Charset.forName來建立Charsetpython

//指定編碼寫入
 String content = "應龍----張風捷特烈\n" +
         "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
         "時逢雷霆風會雨,應乘扶搖化入雲。";
val pathGBK = "G:/Out/language/kotlin/應龍-GBK.txt"
val pathUTF8 = "G:/Out/language/kotlin/應龍-UTF8.txt"

val gbk = Charset.forName("GBK")//建立Charset
File(pathGBK).writeText(content, gbk)
File(pathUTF8).writeText(content, Charsets.UTF_8)
複製代碼

4.讀取字符文件並制定字符集

感受蠻爽的,各類花式玩法c++

|------ 一次讀完
val pathUTF8 = "G:/Out/language/kotlin/應龍-UTF8.txt"
val result = File(pathUTF8).readText(Charsets.UTF_8)
//val result = File(pathUTF8).readText(Charset.forName("GBK"))
println(result)

//|--------按行讀取
File(pathUTF8).forEachLine {
    println(it)
}

//|--------讀取幾行
File(pathUTF8).readLines().take(2).forEach{
    println(it)
}

//|------File直接各類開流,注意它們的類型
val fileUTF8 = File(pathUTF8)
val isr = fileUTF8.reader(Charsets.UTF_8)//InputStreamReader
val osw = fileUTF8.writer(Charsets.UTF_8)//OutputStreamWriter
val fis = fileUTF8.inputStream()//FileInputStream
val fos = fileUTF8.outputStream()//FileOutputStream
val br = fileUTF8.bufferedReader(Charsets.UTF_8)//BufferedReader
val bw = fileUTF8.bufferedWriter(Charsets.UTF_8)//BufferedWriter
val pw = fileUTF8.printWriter(Charsets.UTF_8)//PrintWriter
複製代碼

5.文件操做
|-- 遍歷language文件夾---------------------------------------------
val dir = "G:/Out/language";
File(dir).walk().maxDepth(2)//深度
        .filter {it.absolutePath.contains("kotlin")}//過濾
        .forEach { println(it.absolutePath)//操做
}

|-- 重命名-----------------------------------------------------------
val file = File(path)
val dest = File(file.parent, "應龍-temp.txt")
file.renameTo(dest)

|-- 獲取磁盤空間----------------------------------------------------
val space = dest.usableSpace//獲取該磁盤可用大小
println((space * 1f / 1024f / 1024f / 1024f).toString() + "G")//260.25247G
val freeSpace = dest.freeSpace//同上
println((freeSpace * 1f / 1024f / 1024f / 1024f).toString() + "G")//260.25247G
val totalSpace = dest.totalSpace//獲取該磁盤總大小
println((totalSpace * 1f / 1024f / 1024f / 1024f).toString() + "G")//316.00098G

|-- 修改日期-----------------------------------------------------
val time = SimpleDateFormat("yyyy/MM/dd a hh:mm:ss ")
        .format(dest.lastModified())
println(time)

|--刪除文件-----------------------------------------------
dest.delete();//刪除文件
複製代碼

6.讀寫權限相關
|-- 寫相關
val fileUTF8 = File(pathUTF8)
fileUTF8.setWritable(false)//不可寫
fileUTF8.setWritable(true)//可讀
fileUTF8.canWrite()//是否可寫--false

|-- 寫相關
fileUTF8.canRead();//是否可讀--true
fileUTF8.setReadable(false);//不可寫讀
fileUTF8.setReadable(true);//可讀
fileUTF8.setReadOnly();//只讀
複製代碼

3、JavaScript版

1.建立文件
|-- 建立文件夾--------------------------------------
|-- {recursive: true}表示可遞歸建立
const fs = require("fs");
let path = "G:/Out/language/javascript";
fs.mkdir(path, {recursive: true}, function (err) {
    if (err) {
        console.log(err);
    }
    console.log("建立ok");
});

|-- 建立文件--------------------------------------
fs.writeFile(path + "/應龍.txt", "", (err) => {
    if (err) throw err;
    console.log('文件建立完成');
});
複製代碼

2.寫入字符文件

writeFile的同步異步git

let content = "應龍----張風捷特烈\n" +
    "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
    "時逢雷霆風會雨,應乘扶搖化入雲。";
    
|--- 異步寫入
fs.writeFile(path + "/應龍.txt", content, (err) => {
    if (err) throw err;
    console.log('文件已保存');
})

|--- 同步寫入
fs.writeFileSync(path + "/應龍.txt","writeFileSync");
複製代碼

3.寫入字符文件並制定字符集

默認node不支持GBK...,可經過:第三方模塊iconv-lite來轉換編碼github

//指定編碼寫入
 String content = "應龍----張風捷特烈\n" +
         "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
         "時逢雷霆風會雨,應乘扶搖化入雲。";
         
fs.writeFile(path + "/應龍-UTF8.txt", content, {encoding: 'utf8'}, (err) => {
    if (err) throw err;
    console.log('文件已保存');
});
複製代碼

4.讀取字符文件並制定字符集
|--- 異步讀取
fs.readFile(path + "/應龍.txt", (err, data) => {
    if (err) throw err;
    console.log(data.toString());
});

|--- 同步讀取
let data = fs.readFileSync(path + "/應龍.txt").toString();
console.log(data);

|--- open方法+read(文件描述符,緩衝區,緩衝區偏移量,字節數,起始位置,回調函數)+close
let buf = new Buffer.alloc(1024);
fs.open(pathDir + "/應龍-temp.txt", "r+", (err, fd) => {
    if (err) throw err;
    fs.read(fd, buf, 0, buf.length, 0, (err, bytes, buffer) => {
        console.log(bytes);//字節長度
        console.log(buffer.toString());//數據
        fs.close(fd, function (err) {// 關閉文件
            if (err) throw err;
            console.log("文件關閉成功");
        });
    })
});
複製代碼

5.文件操做
|-- 文件狀態--異步---------------------------------------------
fs.stat(path + "/應龍.txt", function (err, stats) {
    if (err) {
        return console.error(err);
    }
    console.log(stats);
    //Stats {
    //   dev: 3540543445,
    //   mode: 33206,
    //   nlink: 1,
    //   uid: 0,
    //   gid: 0,
    //   rdev: 0,
    //   blksize: undefined,
    //   ino: 1688849860264802,
    //   size: 123,
    //   blocks: undefined,
    //   atimeMs: 1551622765220.3064,
    //   mtimeMs: 1551624397905.7507,
    //   ctimeMs: 1551624397905.7507,
    //   birthtimeMs: 1551622765220.3064,
    //   atime: 2019-03-03T14:19:25.220Z,
    //   mtime: 2019-03-03T14:46:37.906Z,
    //   ctime: 2019-03-03T14:46:37.906Z,
    //   birthtime: 2019-03-03T14:19:25.220Z }
});

|-- 文件狀態--同步---------------------------------------------
let stat = fs.statSync(path + "/應龍.txt");
console.log(stat);


|-- 遍歷language文件夾---------------------------------------------
fileList("G:/Out/language",file=>{
    console.log(file);
});
/**
 * 文件遍歷方法
 * @param filePath 須要遍歷的文件路徑
 */
function fileList(filePath,cbk) {
    fs.readdir(filePath, (err, files) => {//讀取當前文件夾
            if (err) throw err;
            files.forEach(filename => {//遍歷文件列表
                let file = path.join(filePath, filename);//文件路徑拼合
                fs.stat(file, function (eror, stats) {//獲取fs.Stats對象
                    if (err) throw err;
                    let isFile = stats.isFile();//是文件
                    let isDir = stats.isDirectory();//是文件夾
                    if (isFile) {
                        cbk(file);
                    }
                    if (isDir) {
                        fileList(file,cbk);//遞歸,若是是文件夾,就繼續遍歷該文件夾下面的文件
                    }
                })
            });
        }
    )
}

|-- 重命名-----------------------------------------------------------
fs.rename('G:/Out/language/javascript/應龍.txt', 'G:/Out/language/javascript/應龍-temp.txt', (err) => {
    if (err) throw err;
    console.log('重命名完成');
});

|--刪除文件-----------------------------------------------
fs.unlink('G:/Out/language/javascript/應龍-temp.txt', (err) => {
    if (err) throw err;
    console.log('刪除完成');
});
複製代碼

6.讀寫權限相關

函數的options 參數的 flag 字段是控制讀寫權限的,下面的當作常識,瞭解一下
方法不少,就不一一說了,比較生疏的,須要的時候仍是看看API,仍是頗有必要的npm

'a' - 打開文件用於追加。若是文件不存在,則建立該文件。
'ax' - 與 'a' 類似,但若是路徑存在則失敗。
'a+' - 打開文件用於讀取和追加。若是文件不存在,則建立該文件。
'ax+' - 與 'a+' 類似,但若是路徑存在則失敗。
'as' - 以同步模式打開文件用於追加。若是文件不存在,則建立該文件。
'as+' - 以同步模式打開文件用於讀取和追加。若是文件不存在,則建立該文件。

'r' - 打開文件用於讀取。若是文件不存在,則會發生異常。
'r+' - 打開文件用於讀取和寫入。若是文件不存在,則會發生異常。
'rs' - 以同步的方式讀取文件。
'rs+' - 以同步模式打開文件用於讀取和寫入。指示操做系統繞開本地文件系統緩存。

'w' - 打開文件用於寫入。若是文件不存在則建立文件,若是文件存在則截斷文件。
'wx' - 與 'w' 類似,但若是路徑存在則失敗。
'w+' - 打開文件用於讀取和寫入。若是文件不存在則建立文件,若是文件存在則截斷文件。
'wx+' - 與 'w+' 類似,但若是路徑存在則失敗。
複製代碼

4、C++版

1.建立文件:
|-- 建立文件夾--------------------------------------
#include <direct.h>
/**
 * 建立多級目錄
 * @param pDirPath  文件夾路徑
 * @return 
 */
int mkDirs(char *pDirPath) {
    int i = 0;
    int iRet;
    int iLen;
    char *pszDir;
    if (nullptr == pDirPath) {
        return 0;
    }
    pszDir = strdup(pDirPath);
    iLen = static_cast<int>(strlen(pszDir));
    // 建立中間目錄
    for (i = 0; i < iLen; i++) {
        if (pszDir[i] == '\\' || pszDir[i] == '/') {
            pszDir[i] = '\0';
            iRet = _access(pszDir, 0);//若是不存在,建立
            if (iRet != 0) {
                iRet = _mkdir(pszDir);
                if (iRet != 0) {
                    return -1;
                }
            }
            pszDir[i] = '/';
        }
    }
    iRet = _mkdir(pszDir);
    free(pszDir);
    return iRet;
}

|-- 建立文件--------------------------------------
#include <fstream>
ofstream file("G:/Out/language/c++/dragon.txt");
複製代碼

2.寫入字符文件
char *content = "應龍----張風捷特烈\n 一遊小池兩歲月,洗卻凡世幾閒塵。\n 時逢雷霆風會雨,應乘扶搖化入雲。";
ofstream file("G:/Out/language/c++/dragon.txt");
if (file.is_open()) {
    file << content;
    file.close();
}
複製代碼

3.寫入字符文件並制定字符集

目前本人關於C++的知識有限,關於字符集相關的可見:此篇:
暫略編程


4.讀取字符文件
ifstream file("G:/Out/language/c++/dragon.txt");
char buffer[1024];
while (!file.eof()) {
    file.getline(buffer, 100);
    cout << buffer << endl;
}
複製代碼

5.文件操做

遍歷文件夾部分參考文章

|-- 遍歷language文件夾---------------------------------------------
/**
 * 遍歷文件夾
 * @param dir 
 */
void scan(const char *dir) {
    intptr_t handle;
    _finddata_t findData;
    handle = _findfirst(dir, &findData);    // 查找目錄中的第一個文件
    if (handle == -1) {
        cout << "Failed to find first file!\n";
        return;
    }
    do {
        if (findData.attrib & _A_SUBDIR
            && !(strcmp(findData.name, ".") == 0
                 || strcmp(findData.name, "..") == 0
        )) {    // 是不是子目錄而且不爲"."".."
            cout << findData.name << "\t<dir>-----------------------\n";
            string subdir(dir);
            subdir.insert(subdir.find("*"), string(findData.name) + "\\");
            cout << subdir << endl;
            scan(subdir.c_str());//遞歸遍歷子文件夾
        } else {
            for (int i = 0; i < 4; ++i)
                cout << "-";
            cout << findData.name << "\t" << findData.size << endl;
        }
    } while (_findnext(handle, &findData) == 0);// 查找目錄中的下一個文件
    _findclose(handle); // 關閉搜索句柄
}

|-- 使用
string inPath = "G:/Out/language/*";//遍歷文件夾下的全部文件
scan(inPath.c_str());

|-- 重命名-----------------------------------------------------------
string path = "G:/Out/language/c++/dragon.txt";
string dest = "G:/Out/language/c++/dragon-temp.txt";
rename(path.c_str(), dest.c_str());

|--刪除文件-----------------------------------------------
if (!_access(dest.c_str(), 0)) {
    SetFileAttributes(dest.c_str(), 0);////去掉文件只讀屬性
    if (DeleteFile(dest.c_str())) {
        cout << dest.c_str() << " 已成功刪除." << endl;
    } else {
        cout << dest.c_str() << " 沒法刪除:" << endl;
    }
} else {
    cout << dest.c_str() << " 不存在,沒法刪除." << endl;
}
複製代碼

6.讀寫權限相關

暫略


5、Python版

1.建立文件:
|-- 建立文件--------------------------------------
#建立文件 支持多級目錄下文件
def create(name):
    parent = os.path.dirname(name)
    if not os.path.exists(parent):
        os.makedirs(parent)  # 建立父文件夾
    if not os.path.exists(name):  # 若是文件不存在
        f = open(name, 'w')
        f.close()
        print(name + " created.")
    else:
        print(name + " already existed.")
    return
    
|-- 使用
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"
create(filePath)
複製代碼

2.寫入字符文件
content = """應龍----張風捷特烈 一遊小池兩歲月,洗卻凡世幾閒塵。 時逢雷霆風會雨,應乘扶搖化入雲。"""
    f = open(filePath, "w", encoding="utf-8")  # 只讀方式打開:w。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
    f.write(content)
    # f.flush() # 需調用,刷新緩衝區 或關閉
    f.close()
    
    
複製代碼

3.寫入字符文件並制定字符集
filePathGBK = "G:/Out/language/python/6/7/4/5/6/應龍-GBK.txt"
content = """應龍----張風捷特烈 一遊小池兩歲月,洗卻凡世幾閒塵。 時逢雷霆風會雨,應乘扶搖化入雲。"""

f = open(filePathGBK, "w", encoding="gbk") 
f.write(content)
# f.flush() # 需調用,刷新緩衝區 或關閉
f.close()
複製代碼

4.讀取字符文件並制定字符集
|--- 一段一段讀
 f = open(filePath, encoding="utf-8")  # 默認只讀方式打開:r
 print(f.readline())  # 應龍----張風捷特烈
 print(f.readline(5))  # 一遊小池兩
 print(f.readline(5))  # 歲月,洗卻
 print(f.read(4))  # 凡世幾閒

|--- 返回全部行的列表
f = open(filePath, encoding="utf-8")  # 默認只讀方式打開:r
readlines = f.readlines() #<class 'list'>
print(readlines[0])  # 應龍----張風捷特烈
print(readlines[1])  # 一遊小池兩歲月,洗卻凡世幾閒塵。
print(readlines[2])  # 時逢雷霆風會雨,應乘扶搖化入雲。

|--- 迭代遍歷
f = open(filePath, encoding="utf-8")
for line in iter(f):  # 迭代遍歷
    print(line)
複製代碼

5.文件操做
|-- 文件信息---------------------------------------------
f1 = open(filePath)
print(f1.fileno())  # 4 文件描述符
print(f1.mode)  # r 文件打開模式
print(f1.closed)  # False 文件是否關閉
print(f1.encoding)  # cp936 文件編碼
print(f1.name)  # G:/Out/language/python/6/7/4/5/6/應龍.txt 文件名稱
f1.close()

print(os.path.exists(filePath))  # True 是否存在
print(os.path.isdir(filePath))  # False 是不是文件夾
print(os.path.isfile(filePath))  # True 是不是文件
print(os.path.getsize(filePath))  # 125 文件大小
print(os.path.basename(filePath))  # 應龍.txt
print(os.path.dirname(filePath))  # G:/Out/language/python/6/7/4/5/6

print(os.stat(filePath))
#os.stat_result(
# st_mode=33206,
# st_ino=2533274790397459,
# st_dev=3540543445,
# st_nlink=1,
# st_uid=0,
# st_gid=0,
# st_size=133,
# st_atime=1551668005,
# st_mtime=1551668005,
# st_ctime=1551667969)

|-- 文件狀態--同步---------------------------------------------
let stat = fs.statSync(path + "/應龍.txt");
console.log(stat);


|-- 遍歷language文件夾---------------------------------------------
# 掃描文件加下全部文件
def scan(dir):
    if os.path.exists(dir):
        lists = os.listdir(dir)
        for i in range(0,len(lists)):
            sonPath = os.path.join(dir, lists[i])
            print(sonPath)
            if os.path.isdir(sonPath):
                scan(sonPath)
|--使用
scan("G:/Out/language")

|-- 重命名-----------------------------------------------------------
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"
destPath = "G:/Out/language/python/6/7/4/5/6/應龍-temp.txt"
os.rename(filePath,destPath)

|--刪除文件-----------------------------------------------
os.remove(destPath)
複製代碼

6.讀寫權限相關
# 文件打開方式
# r: 只讀 --文件的指針將會放在文件的開頭。這是默認模式。
# rb:二進制只讀。 --文件指針將會放在文件的開頭。這是默認模式。
# r+:讀寫。 --文件指針將會放在文件的開頭。
# rb+:二進制讀寫。 --文件指針將會放在文件的開頭。

# w: 只寫 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# wb:二進制只讀。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# w+:讀寫。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# wb+:二進制讀寫。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件

# a: 追加。 --若是該文件已存在,文件指針將會放在文件的結尾。新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
# ab:二進制追加。
# a+:追加讀寫。
# ab+:二進制追加讀寫。

 print(os.access(filePath, os.F_OK))  # True 是否存在
 print(os.access(filePath, os.R_OK))  # True 讀權限
 print(os.access(filePath, os.W_OK))  # True 寫權限
 print(os.access(filePath, os.X_OK))  # True 執行權限
複製代碼

6、Dart版

1.建立文件
|-- 異步建立文件 --------------------------------------
 File(filePath).create(recursive: true).then((file) {
   print("建立完成");
 });
 
|-- 異步建立文件 --------------------------------------
void create(String filePath) async {
  var file = File(filePath);
  if (await file.exists()) {
    return;
  }
  await file.create(recursive: true);
  print("建立完成");
}

|-- 同步建立
File(filePath).createSync(recursive: true);

|-- 使用
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"

複製代碼

2.寫入字符文件

就演示一下異步的,同步的要簡單些,直接用就好了

const content = "應龍----張風捷特烈\n" + "一遊小池兩歲月,洗卻凡世幾閒塵。\n" + "時逢雷霆風會雨,應乘扶搖化入雲。";
File(filePath).writeAsString(content).then((file) {
  print("寫入成功!");
});
複製代碼

3.寫入字符文件並制定字符集

瞟了一下源碼,貌似木有gbk

//指定編碼寫入
 String content = "應龍----張風捷特烈\n" +
         "一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
         "時逢雷霆風會雨,應乘扶搖化入雲。";
val pathISO8859 = "G:/Out/language/kotlin/應龍-ISO8859.txt"

File(pathISO8859)
    .writeAsString("Hello Dart", encoding: Encoding.getByName("iso_8859-1:1987"))
    .then((file) {
  print("寫入成功!");
});
複製代碼

4.讀取字符文件並制定字符集
File(pathGBK)
    .readAsString(encoding: Encoding.getByName("iso_8859-1:1987"))
    .then((str) {
  print(str);
});
複製代碼

5.文件操做
|-- 信息
file.exists();//是否存在
file.length(); //文件大小(字節)
file.lastModified(); //最後修改時間
file.parent.path; //獲取父文件夾的路徑


|-- 遍歷language文件夾---------------------------------------------
 var dir = Directory(r"G:/Out/language");//遞歸列出全部文件
 var list = dir.list(recursive: true);
 list.forEach((fs){
   print(fs.path);
 });

|-- 重命名-----------------------------------------------------------
var srcPath = r"G:/Out/language/dart/6/7/4/5/6/應龍.txt";
var destPath = r"G:/Out/language/dart/6/7/4/5/6/應龍-temp.txt";
File(srcPath).rename(destPath);

|--刪除文件-----------------------------------------------
File(destPath).delete();
複製代碼

關於各語言認識深淺不一,若有錯誤,歡迎批評指正。


後記:捷文規範

1.本文成長記錄及勘誤表
項目源碼 日期 附錄
V0.1--無 2018-3-4

發佈名:編程語言對比手冊-縱向版[-文件-]
捷文連接:https://juejin.im/post/5c7a9595f265da2db66df32c

2.更多關於我
筆名 QQ 微信
張風捷特烈 1981462002 zdl1994328

個人github:https://github.com/toly1994328
個人簡書:https://www.jianshu.com/u/e4e52c116681
個人簡書:https://www.jianshu.com/u/e4e52c116681
我的網站:http://www.toly1994.com

3.聲明

1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大編程愛好者共同交流
3----我的能力有限,若有不正之處歡迎你們批評指證,一定虛心改正
4----看到這裏,我在此感謝你的喜歡與支持

icon_wx_200.png
相關文章
相關標籤/搜索