首頁 > 軟體

Node的檔案系統你瞭解多少

2022-02-23 19:00:29

一、Node的檔案系統

1、FS(FileSystem):實現對檔案的IO操作。fs是Node的模組,需要匯入

var fs = require('fs');

2、同步和非同步

(1)同步:程式在涉及到檔案IO時,必須等到檔案IO操作結束後再執行後續的操作。

(2)非同步:程式在涉及到檔案IO時,不等待檔案IO操作結束,繼續執行後續的操作,當檔案IO操作結束後系統會通知程式處理檔案 IO的結果。

3、回撥函數

"回撥"即"回頭呼叫";"回撥函數"是指函數定義後並不立即呼叫,而是等到某個事件被觸發時再呼叫。具有非同步特性

4、fs模組的常用函數

(1)讀檔案

A、readFile():用於非同步讀取資料。  - - - - 非阻塞方式讀

fs.readFile(fileName, function (err, buffer) {//非同步讀取檔案
  if (err) throw err;//處理檔案的程式碼
   process(buffer);
});

"filename":檔名(包含路徑)

"function(err,buffer)":回撥函數,'err'存放的是讀檔案失敗的資訊;'buffer'存放檔案的內容

B、readFileSync():用於同步讀取檔案,返回一個字串。- - - -阻塞方式

var text = fs.readFileSync(fileName, 'utf8');

readFileSync(filename,'utf8')//同步讀檔案,函數的返回值是字串(檔案內容)

第二個引數:用來指定字元集,若不指定則函數返回Buffer;若指定則返回字串

//建立input.txt
山海皆可平
新年快樂
//建立read,js
//1.匯入fs模組
const fs = require('fs');
//2.非同步讀取
fs.readFile('input.txt',function (err,buf) {
    if(err){
        return console.error(err)
    }
    console.log("非同步讀檔案:",buf.toString())
})
console.log('2022-1-2')
//    2022-1-2
//    非同步讀檔案: 山海皆可平
//    新年快樂
//1.匯入fs模組
const fs = require('fs');
//3.同步讀取
let str = fs.readFileSync('input.txt','utf8');
console.log("同步讀檔案:",str);
console.log('2022-1-2')
//    同步讀檔案: 山海皆可平
//    新年快樂
//    2022-1-2

(2)開啟檔案

fs.open(path, flags[, mode], callback)

open(path, flags[, mode], callback)

'path':檔名(包含路徑)

'flags':開啟檔案的方式

'mode':設定檔案模式,但前提是已建立該檔案。它預設為0666,讀取和寫入

'callback':這是回撥函數,有兩個引數(err, fd)

--'r':以唯讀方式開啟檔案,若檔案不存在則報異常

--'w':為寫開啟檔案,若檔案則建立檔案

--'a':向檔案中追加內容,若檔案則建立檔案

--'rs':同步方式開啟檔案

//1.匯入fs模組
const fs = require('fs');
fs.open('input.txt','r+',function (err,fd) {
    if(err){
        return console.error(err)
    }
    console.log("fd:",fd);
    console.log('開啟檔案成功!');
})
//    fd: 3
//    開啟檔案成功!

(3)獲取檔案資訊

是一個物件,包含檔案或目錄(資料夾)的具體資訊。通過該物件可以判斷當前處理的是物件還是目錄

fs.stat(path, callback)

'path': 檔名,包括路徑字串。

'callback':回撥函數得到兩個引數(err, stats)

//1.匯入fs模組
const fs = require('fs');
fs.stat('text',function (err,stats) {
    if (err){
        return console.error(err)
    }
    console.log("檔案狀態:",stats);
    //檢查
    console.log("isFile? ----",stats.isFile()) //判斷物件是否是檔案
    console.log("isDirectory?----",stats.isDirectory())//判斷物件是否是目錄
})
// 檔案狀態: Stats {
//     dev: 3959906401,
//         mode: 16822,
//         nlink: 1,
//         uid: 0,
//         gid: 0,
//         rdev: 0,
//         blksize: 4096,
//         ino: 27584547718321690,
//         size: 0,
//         blocks: 0,
//         atimeMs: 1645523918307.2014,
//         mtimeMs: 1645523918307.2014,
//         ctimeMs: 1645523918307.2014,
//         birthtimeMs: 1645523918307.2014,
//         atime: 2022-02-22T09:58:38.307Z,
//         mtime: 2022-02-22T09:58:38.307Z,
//         ctime: 2022-02-22T09:58:38.307Z,
//         birthtime: 2022-02-22T09:58:38.307Z
// }
// isFile? ---- false
//     isDirectory?---- true

(4)寫入檔案

fs.writeFile(filename, data[, options], callback)

A、writeFile  --- 非同步寫入檔案

'filename' : 檔名,包括路徑字串

'data':字串或緩衝區將被寫入到檔案中

'options': 一個物件,用於指定編碼格式。預設編碼是UTF8。

'callback': 回撥函數獲取一個引數err,用於在發生任何寫入錯誤時返回錯誤。

const  fs = require('fs');
//1.向input.txt中寫入內容
fs.writeFile('input.txt','雲與海',function (err) {
    if(err){
        return console.error(err)
    }
    console.log('寫入檔案成功!');
})

B、writeFileSync(fileName, data, 'utf8'); //同步寫

fs.writeFileSync(fileName, str, 'utf8');

(5)讀取檔案(以二進位制方式讀)

fs.read(fd, buffer, offset, length, position, callback)

'fd':是檔案的描述符,由open函數返回

'buffer':緩衝區。存放從二進位制檔案讀取的內容

'offset':偏移量。寫入緩衝區的位置

'length':讀取的位元組數

'position':表示從檔案的某個位置讀。預設從當前位置開始

'callback':回撥函數

const  fs = require('fs');
//讀取二進位制檔案
var buf = new Buffer(1024);
fs.open('input.txt','r+',function (err,fd) {
    if(err){
        return console.error(err)
    }
    console.log('開啟檔案成功!')
    fs.read(fd,buf,0,buf.length,0,function (err,bytes) {
        if (err){
            return console.error(err);
        }
        if(bytes > 0){
            let str = buf.slice(0,bytes).toString();
            console.log("讀取的內容是:",str);
        }
    })
    console.log('----End----');
})
//     開啟檔案成功!
//     ----End----
//     讀取的內容是: 離離原上草,一歲一枯榮
 

(6)關閉檔案

close(fd, callback)
const  fs = require('fs');
//讀取二進位制檔案
var buf = new Buffer(1024);
fs.open('input.txt','r+',function (err,fd) {
    if(err){
        return console.error(err)
    }
    console.log('開啟檔案成功!')
    fs.read(fd,buf,0,buf.length,0,function (err,bytes) {
        if (err){
            return console.error(err);
        }
        if(bytes > 0){
            let str = buf.slice(0,bytes).toString();
            console.log("讀取的內容是:",str);
        }
    })
    fs.close(fd,function (err) {
        if (err){
            return console.error(err)
        }
        console.log('檔案關閉成功!')
    })
    console.log('----End----');
})
//     開啟檔案成功!
//     ----End----
//     讀取的內容是: 離離原上草,一歲一枯榮
//     檔案關閉成功!

(7)建立目錄(資料夾)

mkdir(path[, mode], callback)

'path':要建立的包括路徑的目錄名

'mode':目錄的許可權,預設是可讀可寫

callback':回撥函數

const  fs = require('fs');
fs.mkdir('./yunxi',function (err) {
    if (err){
        return console.error(err)
    }
    console.log('建立目錄成功!')
})

(8)刪除目錄

rmdir(path, callback)
const  fs = require('fs');
fs.rmdir('./text',function (err) {
    if (err){
        return console.error(err)
    }
    console.log('刪除成功!')
})

(9)讀取目錄

readdir(path, callback)

'path':目錄名

'callback':回撥函數,有兩個引數(err,files),'files'是列表,當中放的是當前目錄下的檔案或資料夾名稱

onst  fs = require('fs');
fs.readdir('./yunxi',function (err,files) {
    if (err){
        return console.error(err)
    }
    files.forEach(function (file) {
        console.log(file)
    })
})
//    demo.css
//    exam.ts
//    zhou

(10)檔案拷貝

copyFile(原始檔,目標檔案,回撥函數)

const  fs = require('fs');
fs.copyFile('./input.txt','./target.txt',function (err) {
    if (err){
        return console.error(err)
    }
    console.log('檔案拷貝成功!')
})
//target檔案中拷貝了input檔案裡的內容

(11)給檔案中追加內容

appendFile(filename,content,callback)

'content':追加的內容

const  fs = require('fs');
let content = "n野火燒不盡,n春風吹又生";
fs.appendFile('./input.txt',content,function (err){
    if (err){
        return console.error(err)
    }
    console.log('追加內容成功!');
})
//input檔案中的內容是:離離原上草,一歲一枯榮。野火燒不盡,春風吹又生。

(12)刪除檔案

unlink(path, callback)

'path':帶路徑的檔名

allback':回撥函數,沒有引數

const  fs = require('fs');
fs.unlink('./target.txt',function (err) {
    if (err){
        return console.error(err)
    }
    console.log('刪除檔案成功!')
})

(13)檔案重新命名

rename(oldPath, newPath, callback)

'oldPath':原檔名

'newPath':新檔名

'callback':回撥函數

const  fs = require('fs');
fs.rename('./input.txt','./yunxi.txt',function (err){
    if (err){
        return console.error(err)
    }
    console.log('重新命名成功!')
})
//將input檔案重新命名為yunxi

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!  


IT145.com E-mail:sddin#qq.com