Latest web development tutorials

Node.js 文件系統

Node.js 提供一組類似UNIX(POSIX)標準的文件操作API。 Node 導入文件系統模塊(fs)語法如下所示:

var fs = require("fs")

異步和同步

Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內容的函數有異步的fs.readFile() 和同步的fs.readFileSync()。

異步的方法函數最後一個參數為回調函數,回調函數的第一個參數包含了錯誤信息(error)。

建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞。

實例

創建input.txt 文件,內容如下:

本教程官网地址:www.w3big.com
文件读取实例

創建file.js 文件, 代碼如下:

var fs = require("fs");

// 异步读取
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("异步读取: " + data.toString());
});

// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());

console.log("程序执行完毕。");

以上代碼執行結果如下:

$ node file.js 
同步读取: 本教程官网地址:www.w3big.com
文件读取实例

程序执行完毕。
异步读取: 本教程官网地址:www.w3big.com
文件读取实例

接下來,讓我們來具體了解下Node.js 文件系統的方法。


打開文件

語法

以下為在異步模式下打開文件的語法格式:

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

參數

參數使用說明如下:

  • path -文件的路徑。

  • flags -文件打開的行為。具體值詳見下文。

  • mode -設置文件模式(權限),文件創建默認權限為0666(可讀,可寫)。

  • callback -回調函數,帶有兩個參數如:callback(err, fd)。

flags 參數可以是以下值:

Flag 描述
r 以讀取模式打開文件。 如果文件不存在拋出異常。
r+ 以讀寫模式打開文件。 如果文件不存在拋出異常。
rs 以同步的方式讀取文件。
rs+ 以同步的方式讀取和寫入文件。
w 以寫入模式打開文件,如果文件不存在則創建。
wx 類似'w',但是如果文件路徑存在,則文件寫入失敗。
w+ 以讀寫模式打開文件,如果文件不存在則創建。
wx+ 類似'w+', 但是如果文件路徑存在,則文件讀寫失敗。
a 以追加模式打開文件,如果文件不存在則創建。
ax 類似'a', 但是如果文件路徑存在,則文件追加失敗。
a+ 以讀取追加模式打開文件,如果文件不存在則創建。
ax+ 類似'a+', 但是如果文件路徑存在,則文件讀取追加失敗。

實例

接下來我們創建file.js 文件,並打開input.txt 文件進行讀寫,代碼如下所示:

var fs = require("fs");

// 异步打开文件
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
});

以上代碼執行結果如下:

$ node file.js 
准备打开文件!
文件打开成功!

獲取文件信息

語法

以下為通過異步模式獲取文件信息的語法格式:

fs.stat(path, callback)

參數

參數使用說明如下:

  • path -文件路徑。

  • callback -回調函數,帶有兩個參數如:(err, stats), stats是fs.Stats對象。

fs.stat(path)執行後,會將stats類的實例返回給其回調函數。 可以通過stats類中的提供方法判斷文件的相關屬性。 例如判斷是否為文件:

var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile()); 		//true
})

stats類中的方法有:

方法 描述
stats.isFile() 如果是文件返回true,否則返回false。
stats.isDirectory() 如果是目錄返回true,否則返回false。
stats.isBlockDevice() 如果是塊設備返回true,否則返回false。
stats.isCharacterDevice() 如果是字符設備返回true,否則返回false。
stats.isSymbolicLink() 如果是軟鏈接返回true,否則返回false。
stats.isFIFO() 如果是FIFO,返回true,否則返回false。 FIFO是UNIX中的一種特殊類型的命令管道。
stats.isSocket() 如果是Socket 返回true,否則返回false。

實例

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("准备打开文件!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("读取文件信息成功!");
   
   // 检测文件类型
   console.log("是否为文件(isFile) ? " + stats.isFile());
   console.log("是否为目录(isDirectory) ? " + stats.isDirectory());    
});

以上代碼執行結果如下:

$ node file.js 
准备打开文件!
{ dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 40333161,
  size: 61,
  blocks: 8,
  atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST),
  mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST),
  ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) }
读取文件信息成功!
是否为文件(isFile) ? true
是否为目录(isDirectory) ? false

寫入文件

語法

以下為異步模式下寫入文件的語法格式:

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

如果文件存在,該方法寫入的內容會覆蓋舊的文件內容。

參數

參數使用說明如下:

  • path -文件路徑。

  • data -要寫入文件的數據,可以是String(字符串)或Buffer(流)對象。

  • options -該參數是一個對象,包含{encoding, mode, flag}。默認編碼為utf8, 模式為0666 , flag 為'w'

  • callback -回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。

實例

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("准备写入文件");
fs.writeFile('input.txt', '我是通过写入的文件内容!',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("数据写入成功!");
   console.log("--------我是分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});

以上代碼執行結果如下:

$ node file.js 
准备写入文件
数据写入成功!
--------我是分割线-------------
读取写入的数据!
异步读取文件数据: 我是通过写入的文件内容

讀取文件

語法

以下為異步模式下讀取文件的語法格式:

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

該方法使用了文件描述符來讀取文件。

參數

參數使用說明如下:

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

  • buffer -數據寫入的緩衝區。

  • offset -緩衝區寫入的寫入偏移量。

  • length -要從文件中讀取的字節數。

  • position -文件讀取的起始位置,如果position的值為null,則會從當前文件指針的位置讀取。

  • callback -回調函數,有三個參數err, bytesRead, buffer,err為錯誤信息, bytesRead表示讀取的字節數,buffer為緩衝區對象。

實例

input.txt 文件內容為:

本教程官网地址:www.w3big.com

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字节被读取");
      
      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

以上代碼執行結果如下:

$ node file.js 
准备打开已存在的文件!
文件打开成功!
准备读取文件:
42  字节被读取
本教程官网地址:www.w3big.com

關閉文件

語法

以下為異步模式下關閉文件的語法格式:

fs.close(fd, callback)

該方法使用了文件描述符來讀取文件。

參數

參數使用說明如下:

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

  • callback -回調函數,沒有參數。

實例

input.txt 文件內容為:

本教程官网地址:www.w3big.com

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件!");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }

      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }

      // 关闭文件
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         } 
         console.log("文件关闭成功");
      });
   });
});

以上代碼執行結果如下:

$ node file.js 
准备打开文件!
文件打开成功!
准备读取文件!
本教程官网地址:www.w3big.com
文件关闭成功

截取文件

語法

以下為異步模式下截取文件的語法格式:

fs.ftruncate(fd, len, callback)

該方法使用了文件描述符來讀取文件。

參數

參數使用說明如下:

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

  • len -文件內容截取的長度。

  • callback -回調函數,沒有參數。

實例

input.txt 文件內容為:

site:www.w3big.com

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("截取10字节后的文件内容。");
   
   // 截取文件
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      } 
      console.log("文件截取成功。");
      console.log("读取相同的文件"); 
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }

         // 仅输出读取的字节
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }

         // 关闭文件
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            } 
            console.log("文件关闭成功!");
         });
      });
   });
});

以上代碼執行結果如下:

$ node file.js 
准备打开文件!
文件打开成功!
截取10字节后的文件内容。
文件截取成功。
读取相同的文件
site:www.r
文件关闭成功

刪除文件

語法

以下為刪除文件的語法格式:

fs.unlink(path, callback)

參數

參數使用說明如下:

  • path -文件路徑。

  • callback -回調函數,沒有參數。

實例

input.txt 文件內容為:

site:www.w3big.com

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("准备删除文件!");
fs.unlink('input.txt', function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("文件删除成功!");
});

以上代碼執行結果如下:

$ node file.js 
准备删除文件!
文件删除成功!

再去查看input.txt 文件,發現已經不存在了。


創建目錄

語法

以下為創建目錄的語法格式:

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

參數

參數使用說明如下:

  • path -文件路徑。

  • mode -設置目錄權限,默認為0777。

  • callback -回調函數,沒有參數。

實例

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("创建目录 /tmp/test/");
fs.mkdir("/tmp/test/",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("目录创建成功。");
});

以上代碼執行結果如下:

$ node file.js 
创建目录 /tmp/test/
目录创建成功。

讀取目錄

語法

以下為讀取目錄的語法格式:

fs.readdir(path, callback)

參數

參數使用說明如下:

  • path -文件路徑。

  • callback -回調函數,回調函數帶有兩個參數err, files,err為錯誤信息,files為目錄下的文件數組列表。

實例

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("查看 /tmp 目录");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});

以上代碼執行結果如下:

$ node file.js 
查看 /tmp 目录
input.out
output.out
test
test.txt

刪除目錄

語法

以下為刪除目錄的語法格式:

fs.rmdir(path, callback)

參數

參數使用說明如下:

  • path -文件路徑。

  • callback -回調函數,沒有參數。

實例

接下來我們創建file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("准备删除目录 /tmp/test");
fs.rmdir("/tmp/test",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("读取 /tmp 目录");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});

以上代碼執行結果如下:

$ node file.js 
准备删除目录 /tmp/test
input.out
output.out
test
test.txt
读取 /tmp 目录
……

文件模塊方法參考手冊

以下為Node.js 文件模塊相同的方法列表:

序號 方法& 描述
1 fs.rename(oldPath, newPath, callback)
異步rename().回調函數沒有參數,但可能拋出異常。
2 fs.ftruncate(fd, len, callback)
異步ftruncate().回調函數沒有參數,但可能拋出異常。
3 fs.ftruncateSync(fd, len)
同步ftruncate()
4 fs.truncate(path, len, callback)
異步truncate().回調函數沒有參數,但可能拋出異常。
5 fs.truncateSync(path, len)
同步truncate()
6 fs.chown(path, uid, gid, callback)
異步chown().回調函數沒有參數,但可能拋出異常。
7 fs.chownSync(path, uid, gid)
同步chown()
8 fs.fchown(fd, uid, gid, callback)
異步fchown().回調函數沒有參數,但可能拋出異常。
9 fs.fchownSync(fd, uid, gid)
同步fchown()
10 fs.lchown(path, uid, gid, callback)
異步lchown().回調函數沒有參數,但可能拋出異常。
11 fs.lchownSync(path, uid, gid)
同步lchown()
12 fs.chmod(path, mode, callback)
異步chmod().回調函數沒有參數,但可能拋出異常。
13 fs.chmodSync(path, mode)
同步chmod().
14 fs.fchmod(fd, mode, callback)
異步fchmod().回調函數沒有參數,但可能拋出異常。
15 fs.fchmodSync(fd, mode)
同步fchmod().
16 fs.lchmod(path, mode, callback)
異步lchmod().回調函數沒有參數,但可能拋出異常。 Only available on Mac OS X.
17 fs.lchmodSync(path, mode)
同步lchmod().
18 fs.stat(path, callback)
異步stat(). 回調函數有兩個參數err, stats,stats 是fs.Stats 對象。
19 fs.lstat(path, callback)
異步lstat(). 回調函數有兩個參數err, stats,stats 是fs.Stats 對象。
20 fs.fstat(fd, callback)
異步fstat(). 回調函數有兩個參數err, stats,stats 是fs.Stats 對象。
21 fs.statSync(path)
同步stat(). 返回fs.Stats 的實例。
22 fs.lstatSync(path)
同步lstat(). 返回fs.Stats 的實例。
23 fs.fstatSync(fd)
同步fstat(). 返回fs.Stats 的實例。
24 fs.link(srcpath, dstpath, callback)
異步link().回調函數沒有參數,但可能拋出異常。
25 fs.linkSync(srcpath, dstpath)
同步link().
26 fs.symlink(srcpath, dstpath[, type], callback)
異步symlink().回調函數沒有參數,但可能拋出異常。 type 參數可以設置為'dir', 'file', 或'junction' (默認為'file') 。
27 fs.symlinkSync(srcpath, dstpath[, type])
同步symlink().
28 fs.readlink(path, callback)
異步readlink(). 回調函數有兩個參數err, linkString。
29 fs.realpath(path[, cache], callback)
異步realpath(). 回調函數有兩個參數err, resolvedPath。
30 fs.realpathSync(path[, cache])
同步realpath()。 返回絕對路徑。
31 fs.unlink(path, callback)
異步unlink().回調函數沒有參數,但可能拋出異常。
32 fs.unlinkSync(path)
同步unlink().
33 fs.rmdir(path, callback)
異步rmdir().回調函數沒有參數,但可能拋出異常。
34 fs.rmdirSync(path)
同步rmdir().
35 fs.mkdir(path[, mode], callback)
S異步mkdir(2).回調函數沒有參數,但可能拋出異常。 mode defaults to 0777.
36 fs.mkdirSync(path[, mode])
同步mkdir().
37 fs.readdir(path, callback)
異步readdir(3). 讀取目錄的內容。
38 fs.readdirSync(path)
同步readdir().返回文件數組列表。
39 fs.close(fd, callback)
異步close().回調函數沒有參數,但可能拋出異常。
40 fs.closeSync(fd)
同步close().
41 fs.open(path, flags[, mode], callback)
異步打開文件。
42 fs.openSync(path, flags[, mode])
同步version of fs.open().
43 fs.utimes(path, atime, mtime, callback)
44 fs.utimesSync(path, atime, mtime)
修改文件時間戳,文件通過指定的文件路徑。
45 fs.futimes(fd, atime, mtime, callback)
46 fs.futimesSync(fd, atime, mtime)
修改文件時間戳,通過文件描述符指定。
47 fs.fsync(fd, callback)
異步fsync.回調函數沒有參數,但可能拋出異常。
48 fs.fsyncSync(fd)
同步fsync.
49 fs.write(fd, buffer, offset, length[, position], callback)
將緩衝區內容寫入到通過文件描述符指定的文件。
50 fs.write(fd, data[, position[, encoding]], callback)
通過文件描述符fd 寫入文件內容。
51 fs.writeSync(fd, buffer, offset, length[, position])
同步版的fs.write()。
52 fs.writeSync(fd, data[, position[, encoding]])
同步版的fs.write().
53 fs.read(fd, buffer, offset, length, position, callback)
通過文件描述符fd 讀取文件內容。
54 fs.readSync(fd, buffer, offset, length, position)
同步版的fs.read.
55 fs.readFile(filename[, options], callback)
異步讀取文件內容。
56 fs.readFileSync(filename[, options])
57 fs.writeFile(filename, data[, options], callback)
異步寫入文件內容。
58 fs.writeFileSync(filename, data[, options])
同步版的fs.writeFile。
59 fs.appendFile(filename, data[, options], callback)
異步追加文件內容。
60 fs.appendFileSync(filename, data[, options])
The 同步version of fs.appendFile.
61 fs.watchFile(filename[, options], listener)
查看文件的修改。
62 fs.unwatchFile(filename[, listener])
停止查看filename 的修改。
63 fs.watch(filename[, options][, listener])
查看filename 的修改,filename 可以是文件或目錄。 返回fs.FSWatcher 對象。
64 fs.exists(path, callback)
檢測給定的路徑是否存在。
65 fs.existsSync(path)
同步版的fs.exists.
66 fs.access(path[, mode], callback)
測試指定路徑用戶權限。
67 fs.accessSync(path[, mode])
同步版的fs.access。
68 fs.createReadStream(path[, options])
返回ReadStream 對象。
69 fs.createWriteStream(path[, options])
返回WriteStream 對象。
70 fs.symlink(srcpath, dstpath[, type], callback)
異步symlink().回調函數沒有參數,但可能拋出異常。

更多內容,請查看官網文件模塊描述: File System