- 新時期的Node.js入門
- 李鍇
- 1028字
- 2019-12-12 17:05:41
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,需要將后續的代碼放到回調函數中。
- ExtGWT Rich Internet Application Cookbook
- .NET之美:.NET關鍵技術深入解析
- 觸·心:DT時代的大數據精準營銷
- 零起步玩轉掌控板與Mind+
- PyTorch自動駕駛視覺感知算法實戰
- Android Studio Essentials
- PHP程序設計(慕課版)
- FFmpeg入門詳解:音視頻流媒體播放器原理及應用
- 數據庫系統原理及MySQL應用教程
- 精通軟件性能測試與LoadRunner實戰(第2版)
- Responsive Web Design by Example
- Mastering Data Mining with Python:Find patterns hidden in your data
- C語言程序設計
- C++程序設計教程
- JavaScript從入門到精通(視頻實戰版)