>[success] # 文件描述符
1. 文件描述符(File descriptors)是在Unix及類Unix操作系統中用于標識打開文件或I/O設備的整數標識符。**對于每個進程,內核維護著一張當前打開的文件和資源表格,每個打開的文件都分配了一個文件描述符。在系統層,所有文件系統操作都使用這些文件描述符來標識和跟蹤每個特定的文件**,**Windows** 系統使用了一個雖然不同但概念上類似的機制來跟蹤資源
* 每個打開的文件都分配了一個稱為文件描述符的簡單的數字標識符。
* 在系統層,所有文件系統操作都使用這些文件描述符來標識和跟蹤每個特定的文件。
2. 文件描述符的主要作用有:
* 用于標識打開的文件或設備。
* 用于進行文件的讀寫操作。
* 用于進行文件的控制操作,例如文件截斷、文件鎖定等。
3. 在Node.js中,Node.js為了簡化用戶的工作,抽象出操作系統之間的特定差異,并為所有打開的文件分配一個數字型的文件描述符,從而提供了一種跨平臺的文件操作方式,`FileHandle`類是用于表示文件操作的句柄對象,它提供了一種新的方式來操作文件系統,相比于傳統的回調函數方式,它更加簡單、清晰、易于維護。使用FileHandle類可以進行文件的**讀取、寫入、截斷等操作**,并且提供了很多方便的方法,例如通過`FileHandle`對象的`withFd()`方法可以直接獲取文件描述符,**從而可以使用底層的系統調用進行操作,提高了性能**。
4. node 中常見的`FileHandle` 類的api
| API名稱 | 描述 | 參數 |
| --- | --- | --- |
| Event: 'close' | 當文件被關閉時觸發的事件 | 無 |
| filehandle.appendFile(data\[, options\]) | 異步地將數據追加到文件中 | data | | | | | ,options |
| filehandle.chmod(mode) | 異步地修改文件的權限 | mode |
| filehandle.chown(uid, gid) | 異步地修改文件的所有者 | uid,gid |
| filehandle.close() | 異步地關閉文件 | 無 |
| filehandle.createReadStream(\[options\]) | 以異步方式創建一個可讀流來從文件讀取數據 | options |
| filehandle.createWriteStream(\[options\]) | 以異步方式創建一個可寫流來寫入數據到文件中 | options |
| filehandle.datasync() | 將文件數據緩存內容同步到磁盤 | 無 |
| filehandle.fd | 獲取文件描述符 | 無 |
| filehandle.read(buffer, offset, length, position) | 異步地從文件中讀取數據到緩沖區 | buffer | ,offset,length,position |
| filehandle.read(\[options\]) | 異步地從文件中讀取數據 | options |
| filehandle.read(buffer\[, options\]) | 異步地從文件中讀取數據到緩沖區 | buffer | ,options |
| filehandle.readableWebStream() | 以異步方式創建一個可讀取的WebStream | 無 |
| filehandle.readFile(options) | 異步地從文件中讀取數據到一個字符串或者Buffer | options |
| filehandle.readLines(\[options\]) | 異步地從文件中讀取數據并將其拆分成行 | options |
| filehandle.readv(buffers\[, position\]) | 異步地將文件內容讀取到緩沖區數組 | buffers>,position |
| filehandle.stat(\[options\]) | 異步地獲取文件信息 | options |
| filehandle.sync() | 將文件緩存內容同步到磁盤 | 無 |
| filehandle.truncate(len) | 異步地截斷文件 | len |
| filehandle.utimes(atime, mtime) | 異步地修改文件的訪問時間和修改時間 | atime | | ,mtime | | |
| filehandle.write(buffer, offset\[, length\[, position\]\]) | 異步地將數據寫入到文件中 | buffer | ,offset,length,position |
| filehandle.write(buffer\[, options\]) | 異步地將數據寫入到文件中 | buffer | ,options |
| filehandle.write(string\[, position\[, encoding\]\]) | 異步地將數據以字符串形式寫入到文件中 | string,position,encoding |
| filehandle.writeFile(data, options) | 異步地將數據寫入到文件中 | data | | | | | ,options |
| filehandle.writev(buffers\[, position\]) | 將數據寫入到文件中 | buffers>,position |
>[info] ## 使用 FileHandle api
| API | 功能 |
| --- | --- |
| fs.promises.open() | 打開文件 |
| fs.promises.opendir() | 打開目錄 |
| fs.promises.createWriteStream() | 創建可寫流 |
| fs.promises.createReadStream() | 創建可讀流 |
- 基礎
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 對比node 和java 使用場景
- node 模塊管理
- 內置模塊 -- buffer
- 內置模塊 -- fs
- fs -- 文件描述符
- fs -- 打開文件 api
- fs -- 文件讀取 api
- fs -- 文件寫入 api
- fs -- 創建目錄 api
- fs -- 讀取文件目錄結構 api
- fs -- 文件狀態(信息) api
- fs -- 刪除文件/目錄 api
- fs -- 重命名 api
- fs -- 復制文件 api
- 內置模塊 -- events
- 內置模塊 -- stream
- 可讀流 -- Readable
- 可寫流 -- Writable
- Duplex
- Transform
- 內置模塊 -- http
- http -- 從客戶端發起
- http -- 從服務端發起
- 內置模塊 -- url
- 網絡開發