官术网_书友最值得收藏!

2.3 File System

File System是Node中使用最為頻繁的模塊之一,該模塊提供了讀寫文件的能力,是借助于底層的linuv的C++ API來實現的。如果讀者關注其底層實現,可以閱讀相關的源碼。

我們知道,瀏覽器中的JavaScript沒有讀寫本地文件系統的能力(忽略IE中的ActiveX),而Node作為服務器編程語言,文件系統API是必需的,File System模塊包含了數十個用于文件操作的API,大多提供同步和異步兩種版本。

關于File System本身并沒有什么特別值得關注的地方,本節也僅僅是羅列了一些常用的API,雖然開發者可以隨時隨地查閱在線API文檔,但有些內容還是需要牢記在心。

下面列出了File System大部分API(只保留了異步版本的):

  • fs.access(path[, mode], callback)
  • fs.appendFile(file,data[,options], callback)
  • fs.chmod(path, mode, callback)
  • fs.chown(path, uid, gid, callback)
  • fs.close(fd, callback)
  • fs.fchmod(fd, mode, callback)
  • fs.fchown(fd, uid, gid, callback)
  • fs.fdatasync(fd, callback)
  • fs.fstat(fd, callback)
  • fs.fsync(fd, callback)
  • fs.ftruncate(fd, len, callback)
  • fs.futimes(fd, atime, mtime, callback)
  • fs.link(existingPath, newPath, callback)
  • fs.lstat(path, callback)
  • fs.mkdir(path[, mode], callback)
  • fs.open(path, flags[, mode], callback)
  • fs.read(fd, buffer, offset, length, position, callback)
  • fs.readdir(path[, options], callback)
  • fs.readFile(file[, options], callback)
  • fs.readlink(path[, options], callback)
  • fs.rename(oldPath,newPath,callback)
  • fs.rmdir(path, callback)
  • fs.stat(path, callback)
  • fs.symlink(target,path[, type], callback)
  • fs.truncate(path, len, callback)
  • fs.unlink(path, callback)
  • fs.unwatchFile(filename[, listener])
  • fs.utimes(path, atime, mtime, callback)
  • fs.watch(filename[, options][, listener])
  • fs.watchFile(filename[,options], listener)
  • fs.write(fd, buffer, offset, length[, position], callback)
  • fs.write(fd, data[, position[, encoding]], callback)
  • fs.writeFile(file,data[,options], callback)

下面介紹幾個常用的API。

1.readFile

該方法的聲明如下:

readFile方法用來異步讀取文本文件中的內容,例如:

readFile會將一個文件的全部內容都讀到內存中,適用于體積較小的文本文件;如果你有一個數百MB大小的文件需要讀取,建議不要使用readFile而是選擇stream。readFile讀出的數據需要在回調方法中獲取,而readFileSync直接返回文本數據內容。

如果不指定readFile的encoding配置,readFile會直接返回類似下面的Buffer格式;如果希望得到的是字符串形式,還需要調用toString方法進行轉換:

2.writeFile

該方法的聲明如下:

在WriteFile的第一個參數為文件名,如果不存在,則會嘗試創建它(默認的flag為w)。

3.fs.stat(path, callback)

stat方法通常用來獲取文件的狀態。

通常開發者可以在調用open()、read(),或者write方法之前調用fs.stat方法,用來判斷該文件是否存在。

代碼2.6 使用stat獲取文件狀態

如果文件存在,result就會返回文件的狀態信息,例如下面的輸出結果:

如果文件不存在,則會出現Error: ENOENT: no such file or directory的錯誤。

和fs.fstat的區別

如果閱讀Nodejs文檔,發現File System模塊還有一個fstat方法,其聲明格式為:

這兩個方法在功能上是等價的,唯一的區別是fstat方法第一個參數是文件描述符,格式為Integer,因此fstat方法通常搭配open方法使用,因為open方法返回的結果就是一個文件描述符。

這段代碼和fs.stat所示例代碼在功能上等價。

下面是一個例子——獲取目錄下的所有文件名,這是一個常見的需求,實現這個功能只需要fs.readdir以及fs.stat兩個API,readdir用于獲取目錄下的所有文件或者子目錄,stat用來判斷具體每條記錄是文件還是子目錄,如果是子目錄,則遞歸調用整個方法。

代碼2.7 獲取目錄下所有的文件名

目標文件目錄結構如圖2-2所示。

圖2-2

在循環獲取文件信息的時候,為了避免嵌套層數過多而使用了fs.statSync而不是fs.stat,如果使用fs.stat,需要將后續的代碼放到回調函數中。

主站蜘蛛池模板: 绍兴县| 肥东县| 镇沅| 沽源县| 南阳市| 青龙| 萝北县| 策勒县| 白山市| 巴彦县| 东兴市| 富源县| 临夏市| 中宁县| 米泉市| 英吉沙县| 岑溪市| 遂平县| 五华县| 泗水县| 鹰潭市| 荆州市| 隆化县| 南充市| 扬中市| 论坛| 泾川县| 江津市| 武宣县| 遂昌县| 正宁县| 聂拉木县| 阳谷县| 邢台县| 长寿区| 运城市| 仙桃市| 徐州市| 望谟县| 兴隆县| 永新县|