03.06 node.js 07 文件操作

上一篇:

在講完了模塊概念後,這一篇我們看一下node.js中的文件操作。文件操作的API在fs模塊中,fs全稱為 "File System"。

絕大部分編程語言都會提供文件操作功能,node.js也不例外。下面我們主要看一下文件/目錄的判斷,文件的新增,刪除,讀取,寫入,重命名和拷貝等。

node.js 07 文件操作

node.js 文件操作

node.js有一個很大的特點,就是異步操作。這一點在文件操作中也一樣。有些語言判斷文件還是目錄不會使用異步,但是node.js不一樣,使用異步,通過回調函數進行處理。

所以學習node.js一定要有異步的概念,回調函數也是必須要理解的。後面會有關於異步處理的專門講解。

如何判斷傳入路徑為文件還是目錄

首先需要引入fs模塊,然後通過fs.stat方法中的回調函數進行判斷對象是文件還是目錄。

看一下示例代碼,個人一直認為寫代碼不寫註釋就是拒絕團隊合作,拒絕知識共享。

<code>//1. 引入fs模塊
const fs = require('fs');

//2. 調用fs.stat方法,傳入文件,通過回調函數處理data對象
fs.stat('./package.json', (err,data)=>{
if(err){
console.log(err)
return
}


//3. 調用 isFile()方法判斷是否為文件
console.log(`is file: ${data.isFile()}`)
//4. 調用 isDirectory()方法判斷是否為目錄
console.log(`is directory: ${data.isDirectory()}`)
})/<code>

由於package.json是一個文件,所以打印輸出時isFile:true。輸出結果如下:

<code>D:\\Projects\\nodejs\\NodeDemo>node app.js

is file: true

is directory: false/<code>

創建目錄

同樣需要引入"fs"模塊。由於所有的文件操作都需要引入"fs"模塊,後面的示例將不再強調。然後調用fs.mkdir()方法進行創建。

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 調用mkdir()方法創建目錄
fs.mkdir('./testDir', (err)=>{
if(err){
console.log(err);
return;
}
console.log('創建目錄完成')
})/<code>

創建文件並寫入文件

在創建文件時可以通過方法fs.writeFile()直接創建,並寫入內容。

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 創建並寫入文件
fs.writeFile('./test.txt','Hello, node.js', (err)=>{
if(err){
console.log(err)
return
}
console.log('創建寫入文件成功')
})/<code>

上面的代碼示例創建了文件test.txt,並在文件中寫入了"Hello, node.js"。

添加文件內容

如果只是在創建的時候寫入文件內容肯定是不夠的,任何處理文件的語言都需要提供添加文件內容的方法。node.js提供了fs.appendFile()方法。

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 添加文件內容
fs.appendFile('./test.txt', '\\r\\nHello Vincent', (err)=>{
if(err){
console.log(err)
return;
}
console.log('appendFile 成功')
})/<code>

這時,如果我們打開test.txt文件,就會看到創建時寫入的"Hello, node.js"以及這次我們添加的"Hello Vincent"。其中的"\\r\\n"是回車和換行。

Hello, node.js

Hello Vincent

讀取文件內容

方法:fs.readFile(), 是一個異步方法。

示例如下。

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 讀取文件內容
fs.readFile('./test.txt', (err, data)=>{
if(err){
consolog.log(err)
return
}
console.log(data.toString())
})/<code>

讀取目錄

調用方法:fs.readdir(),讀取後輸出該目錄下的子目錄和文件。

示例代碼

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 讀取
fs.readdir('.', (err, data)=>{
if(err){
console.log(err)
return
}
console.log(data)
})/<code>

輸出如下

<code>D:\\Projects\\nodejs\\NodeDemo>node app.js
[ 'app.js', 'testDir', 'package.json', 'test.txt' ]/<code>

重命名

調用方法fs.rename()。這個方法要注意的是,一方面是重命名,另一方面如果如果目標文件不在同一個目錄,那麼這個方法其實是移動文件到目標目錄。

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 重命名,移動文件(本例為移動文件)
fs.rename('./test.txt', './testDir/test.txt', (err) => {
if(err){
console.log(err)
return
}
console.log('移動文件成功')
})/<code>

上述示例把當前目錄下的test.txt文件移動到了./testDir目錄下。

刪除文件

調用方法:fs.unlink()

示例代碼

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 刪除文件
fs.unlink('./test.txt', (err)=>{
if(err){
console.log(err)
return
}
console.log('刪除文件成功')
})/<code>

刪除目錄

調用方法: fs.rmdir().需要注意的是隻有當目錄是一個空目錄時,才能被刪除,否則會報錯。所以需要先遍歷目錄,將目錄下的文件或者子目錄刪除後,才能刪除當前目錄。如果子目錄下還有子目錄,就需要遞歸了。通過npm也可以下載另外的文件處理模塊,可以直接刪除目錄,當然裡面已經封裝好了刪除文件和子目錄的代碼。

下面是一個空目錄刪除的示例

<code>//1. 引入fs模塊
const fs = require('fs');
//2. 刪除目錄
fs.rmdir('./testDir', (err)=>{
if(err){
console.log(err)
return
}
console.log('刪除目錄成功')
})/<code>

字節流

在進入文件拷貝之前,我們有必要了解一下字節流。對於大文件的讀取和寫入,此時通過字節流來進行。

  • 使用字節流讀取文件:fs.createReadStream()
  • 使用字節流寫入文件:fs.createWriteStream()

拷貝文件

首先需要使用字節流讀取源文件,然後創建寫入文件流,最後通過pipe()方法進行拷貝。

<code>const fs = require('fs')
var readStream = fs.createReadStream('./test.MOV')

var writeStream = fs.createWriteStream('./data/copied.MOV')
readStream.pipe(writeStream)/<code>

代碼量很少,簡單方便,整個文件的拷貝就成功了。

總結

node.js對於文件的處理總體來說是簡單便捷的,代碼量少。異步操作貫穿真個fs模塊,在實際編碼工作中也是有一點挑戰的。上面也講過,實際工作中可以通過封裝fs模塊,寫自己的文件操作模塊,封裝目錄刪除等。npm管理中也有一些文件操作模塊可以借鑑。

歡迎朋友們留言交流。

node.js會不斷更新,後續包括http, url, 數據庫操作等內容。


分享到:


相關文章: