<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                &emsp;&emsp;文件系統是一種用于向用戶提供底層數據訪問的機制,同時也是一套實現了數據的存儲、分級組織、訪問和獲取等操作的抽象數據類型。 &emsp;&emsp;Node.js 中的[fs模塊](https://nodejs.org/dist/latest-v18.x/docs/api/fs.html)就是對文件系統的封裝,整合了一套標準 POSIX 文件 I/O 操作的集合,包括文件的讀寫、刪除、遍歷、重命名等操作。 &emsp;&emsp;fs 模塊中的所有方法都提供了三種形式:回調、同步和 Promise ,其中 Promise 是在 Node.js 的版本 10 中引入的。 &emsp;&emsp;本系列所有的示例源碼都已上傳至Github,[點擊此處](https://github.com/pwstrick/node)獲取。? ## 一、三種形式 &emsp;&emsp;在回調形式的方法中,最后一個參數是其回調函數,會異步地調用,其中回調函數的第一個參數始終為異常預留,不過有個例外是 exists() 方法。 &emsp;&emsp;回調形式不容易書寫,很容易就會形成回調地獄。 &emsp;&emsp;雖然同步形式的方法比較容易書寫,但是在執行時會阻止 Node.js 事件循環和阻塞 JavaScript 執行,直到操作完成。 &emsp;&emsp;Promise 形式的方法會使用底層的 Node.js 線程池,在事件循環線程之外異步地執行文件系統操作。對同一文件執行多個并發修改時必須小心,有可能會損壞數據。 &emsp;&emsp;以讀取文件為例,三種形式的寫法如下所示,若不指定編碼,那么輸出的將是 Buffer 實例。 ~~~ const fs = require('fs'); // 回調 fs.readFile('./data.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); // strick }); // 同步 const data = fs.readFileSync('./data.txt', 'utf8'); console.log(data); // strick // Promise const { promises } = fs; async function readFilePromise() { const data = await promises.readFile('./data.txt', 'utf8'); console.log(data); // strick } readFilePromise(); ~~~ ## 二、基礎使用 **1)判斷文件是否存在** &emsp;&emsp;exists() 方法可用于判斷文件是否存在,但在上一小節中曾提到,它已被棄用。 &emsp;&emsp;這是因為此回調的參數與其他回調不一致。通常,Node.js 回調的第一個參數是 err 參數,然后跟可選的其他參數,但 fs.exists() 回調只有一個布爾參數,如下所示。 ~~~ fs.exists('./data.txt', isExist => { console.log(isExist); }); ~~~ &emsp;&emsp;再則是因為 exists() 方法的功能用 access() 方法也能實現,其內部源碼如下所示,其實也是調用了 access() 方法。 ~~~ function exists(path, callback) { maybeCallback(callback); // 構造回調函數 function suppressedCallback(err) { callback(err ? false : true); } try { fs.access(path, F_OK, suppressedCallback); } catch { return callback(false); } } ~~~ &emsp;&emsp;其中 F\_OK 是 fs 模塊中的一個常量,表示文件是否存在,使用方法如下所示,R\_OK 表示是否可讀,W\_OK 表示是否可寫。 ~~~ const { constants } = require('fs'); const { F_OK, R_OK, W_OK } = constants; ~~~ &emsp;&emsp;注意,在調用 fs.open()、fs.readFile() 或 fs.writeFile() 之前,不能使用 fs.access() 檢查文件是否存在。 &emsp;&emsp;因為這樣做會引入競爭條件,其他進程可能會在兩次調用之間修改文件狀態,造成非預期的結果。 &emsp;&emsp;遇到這種場景,推薦的做法是直接打開、讀取或寫入文件,當文件不可用時再做處理。 &emsp;&emsp;另一種判斷文件是否存在的方法是調用 stat(),讀取文件屬性。 &emsp;&emsp;它有兩個方法 isDirectory() 和 isFile() 可分別判斷是否是目錄和是否是文件,如下所示。 ~~~ fs.stat('./data.txt', (err, stats) => { console.log(stats.isDirectory()); console.log(stats.isFile()); }); ~~~ &emsp;&emsp;同樣要注意的是,它也不能在調用 fs.open()、fs.readFile() 或 fs.writeFile() 之前,檢查文件是否存在。 **2)方法** &emsp;&emsp;下面羅列的是 fs 模塊的一些方法。 * fs.open():打開文件,可設置文件模式。 * fs.close():關閉文件描述符。 * fs.createReadStream():創建可讀的文件流。 * fs.createWriteStream():創建可寫的文件流。 * fs.readFile():讀取文件的內容,相關方法:fs.read()。 * fs.writeFile():寫入文件,相關方法:fs.write()。 * fs.link():新建指向文件的硬鏈接。 * fs.unlink():刪除文件或符號鏈接。 * fs.mkdir():新建文件夾。 * fs.rmdir():刪除文件夾。 * fs.readdir():讀取目錄的內容。 * fs.stat():讀取文件屬性,相關方法:fs.fstat()、fs.lstat()。 * fs.access():檢查文件是否存在,以及 Node.js 是否有權限訪問。 * fs.rename():重命名文件或文件夾。 * fs.appendFile():追加數據到文件,如果文件不存在,則創建文件。 * fs.copyFile():拷貝文件,可覆蓋文件內容。 * fs.chmod():更改文件(通過傳入的文件名指定)的權限,相關方法:fs.lchmod()、fs.fchmod()。 * fs.chown():更改文件(通過傳入的文件名指定)的所有者和群組,相關方法:fs.fchown()、fs.lchown()。 * fs.watchFile():開始監控文件的更改,相關方法:fs.watch()。 * fs.unwatchFile():停止監控文件的更改。 **3)路徑** &emsp;&emsp;路徑處理并不是在 fs 模塊,而是在[path模塊](https://nodejs.org/dist/latest-v18.x/docs/api/path.html),它的方法包括。 * path.basename():讀取路徑的最后一部分。 * path.dirname():讀取路徑的目錄部分。 * path.extname():讀取路徑的文件擴展名。 * path.isAbsolute():判斷是否是絕對路徑。 * path.join():將多個部分合并成一個完整的路徑。 * path.normalize():當包含類似 .、.. 或 // 等相對的說明符時,就嘗試計算實際的路徑。 * path.parse():解析成路徑對象。 * path.relative():基于當前目錄,返回從第一個路徑到第二個路徑的相對路徑。 * path.resolve():將相對路徑計算成絕對路徑。 ~~~ path.basename('../06/data.txt') // data.txt path.dirname('../06/data.txt'); // ../06 path.extname('../06/data.txt'); // .txt path.isAbsolute('../06/data.txt'); // false path.join('../', '06', 'data.txt'); // ../06/data.txt path.normalize('/../06/data.txt'); // /06/data.txt // { root: '', dir: '../06', base: 'data.txt', ext: '.txt', name: 'data' } path.parse('../06/data.txt'); path.relative('../', '../06/data.txt'); // 06/data.txt path.resolve('../06/data.txt'); // /Users/code/web/node/06/data.txt ~~~ 參考資料: [判斷文件存在](https://www.nodejs.red/#/nodejs/modules/fs-file-exists-check) [深入Node.js源碼之文件系統](https://yjhjstz.gitbooks.io/deep-into-node/content/chapter11/chapter11-2.html) [Node.js官網文檔](http://nodejs.cn/learn/working-with-file-descriptors-in-nodejs)?[API文件系統](https://nodejs.org/dist/latest-v18.x/docs/api/fs.html) [餓了么File](https://github.com/ElemeFE/node-interview/blob/master/sections/zh-cn/io.md#file) ***** > 原文出處: [博客園-Node.js精進](https://www.cnblogs.com/strick/category/2154090.html) [知乎專欄-前端性能精進](https://www.zhihu.com/column/c_1611672656142725120) 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。 ![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200) 推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看