Node.js文件系統

Node實現文件I/O使用標準的POSIX函數的簡單包裝。Node文件系統(FS)模塊可以使用以下語法輸入:

var fs = require("fs")

同步和異步

在fs模塊的每一個方法都有同步和異步形式。異步方法需要最後一個參數爲完成回調函數和回調函數的第一個參數是錯誤的。它優選使用異步方法來代替同步方法,前者從來不阻止程序的執行,作爲第二使用。

示例

創建一個名爲input.txt的文件有以下內容的文本

Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

讓我們創建一個名爲具有以下代碼main.js一個js文件。

var fs = require("fs"); // Asynchronous read fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("Asynchronous read: " + data.toString()); }); // Synchronous read var data = fs.readFileSync('input.txt'); console.log("Synchronous read: " + data.toString()); console.log("Program Ended");

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Synchronous read: Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

Program Ended
Asynchronous read: Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

以下部分將提供有關主要文件I/ O方法很好的例子。

打開一個文件

語法

以下是在異步模式下打開文件的方法的語法:

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

參數

下面是使用的參數的說明:

  • path - 這是文件名,包括路徑字符串。

  • flags - 標誌告知要打開的文件的行爲。所有可能的值已經提及以下。

  • mode - 這將設置文件模式(許可和粘性位),但前提是在創建該文件。它默認爲0666,讀取和寫入。

  • callback - 這是回調函數得到兩個參數(err, fd)。

Flags

標誌進行讀/寫操作是:

Flag

描述

r

打開文件進行讀取。如果該文件不存在發生異常。

r+

打開文件進行讀取和寫入。如果該文件不存在發生異常。

rs

打開文件,用於讀取在同步方式。

rs+

打開文件進行讀取和寫入,告訴OS同步地打開它。對於'rs'有關使用此慎用見註解。

w

打開文件進行寫入。該文件被創建(如果它不存在)或截斷(如果它存在)。

wx

類似'w',如果路徑存在則失敗。

w+

打開文件進行讀取和寫入。該文件被創建(如果它不存在)或截斷(如果它存在)。

wx+

類似「w+」,但如果路徑存在則失敗。

a

打開文件進行追加。如果它不存在,則創建該文件。

ax

類似「a」,但如果路徑存在則失敗。

a+

打開文件進行讀取和附加。如果它不存在,則創建該文件。

ax+

類似'a+',但如果路徑存在則失敗。

示例

讓我們創建一個名爲main.js一個js文件具有下面的代碼,用於打開一個文件input.txt的讀寫。

var fs = require("fs"); // Asynchronous - Opening File console.log("Going to open file!"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to open file!
File opened successfully!

獲取文件信息

語法

下面是獲取一個文件有關的信息的方法的語法:

fs.stat(path, callback)

語法

下面是使用的參數的說明:

  • path - 這是有文件名,包括路徑字符串。

  • callback - 這是回調函數得到兩個參數(err, stats) ,其中統計數據是這是印在下面的例子中的fs.Stats類型的對象。

除了這些在下面的例子中打印的重要屬性, 還有可以用於檢查文件類型的fs.Stats類可用的有用的方法。這些方法列於下表中。

方法

描述

stats.isFile()

返回true,如果文件類型是一個簡單的文件

stats.isDirectory()

返回true,如果文件類型是目錄

stats.isBlockDevice()

返回true,如果文件類型是塊設備

stats.isCharacterDevice()

返回true,如果文件類型是字符設備

stats.isSymbolicLink()

返回true,如果文件類型是符號連接

stats.isFIFO()

返回true,如果文件類型是FIFO

stats.isSocket()

返回true,如果文件類型是套接字

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to get file info!"); fs.stat('input.txt', function (err, stats) { if (err) { return console.error(err); } console.log(stats); console.log("Got file info successfully!"); // Check file type console.log("isFile ? " + stats.isFile()); console.log("isDirectory ? " + stats.isDirectory()); });

現在運行main.js看到結果:

$ node main.js

驗證輸出

Going to get file info!
{ dev: 1792,
mode: 33188,
nlink: 1,
uid: 48,
gid: 48,
rdev: 0,
blksize: 4096,
ino: 4318127,
size: 97,
blocks: 8,
atime: Sun Mar 22 2015 13:40:00 GMT-0500 (CDT),
mtime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT),
ctime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT) }
Got file info successfully!
isFile ? true
isDirectory ? false

寫入文件

語法

下面是寫入到一個文件中的方法之一的語法:

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

這種方法如果文件已經存在將會覆蓋文件。如果想寫入到現有的文件,那麼你應該使用其他的方法。

參數

下面是使用的參數的說明:

  • path - 這是有文件名,包括路徑字符串

  • data - 這是字符串或緩衝將被寫入到文件中

  • options - 第三個參數是一個對象,它將於{編碼,模式,標誌}。默認編碼是UTF8,模式是八進制值0666和標誌 'w'

  • callback - 這是回調函數獲取一個參數err,並用於在發生任何寫入錯誤返回錯誤。

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to write into existing file"); fs.writeFile('input.txt', 'Simply Easy Learning!', function(err) { if (err) { return console.error(err); } console.log("Data written successfully!"); console.log("Let's read newly written data"); fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("Asynchronous read: " + data.toString()); }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to write into existing file
Data written successfully!
Let's read newly written data
Asynchronous read: Simply Easy Learning!

讀取文件

語法

以下是從文件讀取的方法之一的語法:

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

此方法將使用文件描述符來讀取文件,如果你想直接使用文件名,那麼應該使用其他可用的方法來讀取文件。

參數

下面是使用的參數的說明:

  • fd - 這是通過文件fs.open()方法返回的文件描述符

  • buffer - 這是該數據將被寫入到緩衝器

  • offset - 這是偏移量在緩衝器開始寫入處

  • length - 這是一個整數,指定要讀取的字節的數目

  • position - 這是一個整數,指定從文件中開始讀取。如果位置爲null,數據將從當前文件位置讀取。

  • callback - 這是回調函數獲取三個參數,(err, bytesRead, buffer).

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); var buf = new Buffer(1024); console.log("Going to open an existing file"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); console.log("Going to read the file"); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } console.log(bytes + " bytes read"); // Print only read bytes to avoid junk. if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to open an existing file
File opened successfully!
Going to read the file
97 bytes read
Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

關閉文件

語法

以下是關閉一個打開的文件的方法之一的語法:

fs.close(fd, callback)

參數

下面是使用的參數的說明:

  • fd - 這是通過文件fs.open()方法返回的文件描述符。

  • callback - 這是回調函數

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); var buf = new Buffer(1024); console.log("Going to open an existing file"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); console.log("Going to read the file"); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } // Print only read bytes to avoid junk. if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } // Close the opened file. fs.close(fd, function(err){ if (err){ console.log(err); } console.log("File closed successfully."); }); }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to open an existing file
File opened successfully!
Going to read the file
Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

File closed successfully.

截斷文件

語法

下面是要截斷的打開文件的方法的語法:

fs.ftruncate(fd, len, callback)

參數

下面是使用的參數的說明:

  • fd - 這是通過文件fs.open()方法返回的文件描述符。

  • len - 這是後的文件將被截斷文件的長度。

  • callback - 這是回調函數

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); var buf = new Buffer(1024); console.log("Going to open an existing file"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); console.log("Going to truncate the file after 10 bytes"); // Truncate the opened file. fs.ftruncate(fd, 10, function(err){ if (err){ console.log(err); } console.log("File truncated successfully."); console.log("Going to read the same file"); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } // Print only read bytes to avoid junk. if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } // Close the opened file. fs.close(fd, function(err){ if (err){ console.log(err); } console.log("File closed successfully."); }); }); }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to open an existing file
File opened successfully!
Going to truncate the file after 10 bytes
File truncated successfully.
Going to read the same file
Yiibai
File closed successfully.

刪除文件

語法

以下是刪除文件的方法的語法:

fs.unlink(path, callback)

參數

下面是使用的參數的說明:

  • path - 這是文件名,包括路徑

  • callback - 這是回調函數

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to delete an existing file"); fs.unlink('input.txt', function(err) { if (err) { return console.error(err); } console.log("File deleted successfully!"); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to delete an existing file
File deleted successfully!

創建目錄

語法

下面是創建一個目錄的方法的語法:

fs.mkdir(path[, mode], callback)

參數

下面是使用的參數的說明:

  • path - 這是包括路徑的目錄名。

  • mode - 這是要設置的目錄權限。默認爲0777。

  • callback - 這是回調函數

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to create directory /tmp/test"); fs.mkdir('/tmp/test',function(err){ if (err) { return console.error(err); } console.log("Directory created successfully!"); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to create directory /tmp/test
Directory created successfully!

讀取目錄

語法

下面是讀取一個目錄的方法的語法:

fs.readdir(path, callback)

參數

下面是使用的參數的說明:

  • path - 這是包括路徑的目錄名。

  • callback - 這是回調函數得到兩個參數(err, files),其中文件的文件名的目錄中的數組排除 '.' 和  '..'.

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to read directory /tmp"); fs.readdir("/tmp/",function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ console.log( file ); }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test
test.txt

刪除目錄

語法

下面是該方法刪除目錄的語法:

fs.rmdir(path, callback)

參數

下面是使用的參數的說明:

  • path - 這是包括路徑的目錄名。

  • callback - 這是回調函數

示例

讓我們創建一個名爲main.js的js文件具有下面的代碼:

var fs = require("fs"); console.log("Going to delete directory /tmp/test"); fs.rmdir("/tmp/test",function(err){ if (err) { return console.error(err); } console.log("Going to read directory /tmp"); fs.readdir("/tmp/",function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ console.log( file ); }); }); });

現在運行main.js看到的結果:

$ node main.js

驗證輸出

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test.txt