1. 程式人生 > >Node基礎篇(檔案操作)

Node基礎篇(檔案操作)

檔案操作

相關模組

Node核心提供了很多與檔案操作相關的模組,每個模組都提供了一些最基本的操作API,在NPM中也有社群提供的功能包

fs:

基礎的檔案操作 API

path:

提供和路徑相關的操作 API

readline:

用於讀取大文字檔案,一行一行讀

fs-extra(第三方):

https://www.npmjs.com/package/fs-extra

同步或非同步呼叫

  • fs模組對檔案的幾乎所有操作都有同步和非同步兩種形式
  • 例如:readFile() 和 readFileSync()
  • 區別:
    • 同步呼叫會阻塞程式碼的執行,非同步則不會
    • 非同步呼叫會將讀取任務下達到任務佇列,直到任務執行完成才會回撥
    • 異常處理方面,同步必須使用 try catch 方式,非同步可以通過回撥函式的第一個引數

路徑模組

在檔案操作的過程中,都必須使用物理路徑(絕對路徑),path模組提供了一系列與路徑相關的 API

console.log('join用於拼接多個路徑部分,並轉化為正常格式');
const temp = path.join(__dirname, '..', 'lyrics', './友誼之光.lrc');
console.log(temp);

console.log('獲取路徑中的檔名');
console.log(path.basename(temp));

console.log('獲取路徑中的檔名並排除副檔名');
console.log(path.basename(temp, '.lrc'));

console.log('====================================');

console.log('獲取不同作業系統的路徑分隔符');
console.log(process.platform + '的分隔符為 ' + path.delimiter);

console.log('一般用於分割環境變數');
console.log(process.env.PATH.split(path.delimiter));

console.log('====================================');

console.log('獲取一個路徑中的目錄部分');
console.log(path.dirname(temp));

console.log('====================================');

console.log('獲取一個路徑中最後的副檔名');
console.log(path.extname(temp));

console.log('====================================');

console.log('將一個路徑解析成一個物件的形式');
const pathObject = path.parse(temp);
console.log(pathObject);

console.log('====================================');

console.log('將一個路徑物件再轉換為一個字串的形式');
// pathObject.name = '我終於失去了你';
pathObject.base = '我終於失去了你.lrc';
console.log(pathObject);

console.log(path.format(pathObject));

console.log('====================================');

console.log('獲取一個路徑是不是絕對路徑');
console.log(path.isAbsolute(temp));
console.log(path.isAbsolute('../lyrics/愛的代價.lrc'));

console.log('====================================');

console.log('將一個路徑轉換為當前系統預設的標準格式,並解析其中的./和../');
console.log(path.normalize('c:/develop/demo\\hello/../world/./a.txt'));

console.log('====================================');

console.log('獲取第二個路徑相對第一個路徑的相對路徑');
console.log(path.relative(__dirname, temp));

console.log('====================================');

console.log('以類似命令列cd命令的方式拼接路徑');
console.log(path.resolve(temp, 'c:/', './develop', '../application'));

console.log('====================================');

console.log('獲取不同平臺中路徑的分隔符(預設)');
console.log(path.sep);

console.log('====================================');

console.log('允許在任意平臺下以WIN32的方法呼叫PATH物件');
// console.log(path.win32);
console.log(path === path.win32);

console.log('====================================');

console.log('允許在任意平臺下以POSIX的方法呼叫PATH物件');
console.log(path === path.posix);

原始碼地址:
https://github.com/nodejs/node/blob/master/lib/path.js

檔案讀取

Node中檔案讀取的方式主要有:

fs.readFile(file[, options], callback(error, data))

fs.readFile('c:\\demo\1.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

fs.readFileSync(file[, options])

try {
  const data = fs.readFileSync('c:\\demo\1.txt', 'utf8');
  console.log(data);
} catch(e) {
  // 檔案不存在,或者許可權錯誤
  throw e;
}

fs.createReadStream(path[, options])

const stream = fs.createReadStream('c:\\demo\1.txt');
let data = ''
stream.on('data', (trunk) => {
  data += trunk;
});
stream.on('end', () => {
  console.log(data);
});

由於Windows平臺下預設檔案編碼是GBK,在Node中不支援,可以通過iconv-lite解決

Readline模組逐行讀取文字內容

const readline = require('readline');
const fs = require('fs');

const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt')
});

rl.on('line', (line) => {
  console.log('Line from file:', line);
});

檔案寫入

Node中檔案寫入的方式主要有:

fs.writeFile(file, data[, options], callback(error))

fs.writeFile('c:\\demo\a.txt', new Date(), (error) => {
  console.log(error);
});

fs.writeFileSync(file, data[, options])

try {
  fs.writeFileSync('c:\\demo\a.txt', new Date());
} catch (error) {
  // 資料夾不存在,或者許可權錯誤
  console.log(error);
}

fs.createWriteStream(path[,option])

var streamWriter = fs.createWriteStream('c:\\demo\a.txt');
setInterval(() => {
  streamWriter.write(`${new Date}\n`, (error) => {
    console.log(error);
  });
}, 1000);

檔案寫入

fs.appendFile(file,data[,options],callback(err))

// 相比較之前檔案流的方式,這種方式不會佔用檔案資源,append完成就會釋放
setInterval(() => {
  fs.appendFile('c:\\demo\a.txt',`${new Date}\n`, (error) => {
    console.log(error);
  });
}, 1000);

fs.appendFileSync(file,data[,options])

setInterval(() => {
  fs.appendFileSync('c:\\demo\a.txt',`${new Date}\n`);
}, 1000);

其他常見檔案操作

驗證路徑是否存在(過時的API)

  • fs.exists(path,callback(exists))
  • fs.existsSync(path) // => 返回布林型別 exists

獲取檔案資訊

  • fs.stat(path,callback(err,stats))
  • fs.statSync(path) // => 返回一個fs.Stats例項

移動檔案或重新命名檔案或目錄

與命令列相同,重新命名操作也可以實現檔案移動

  • fs.rename(oldPath,newPath,callback)
  • fs.renameSync(oldPath,newPath)

刪除檔案

  • fs.unlink(path,callback(err))
  • fs.unlinkSync(path)

其他常見資料夾操作

建立一個目錄

  • fs.mkdir(path[,model],callback)
  • fs.mkdirSync(path[,model])

刪除一個空目錄

  • fs.rmdir(path,callback)
  • fs.rmdirSync(path)

讀取一個目錄

  • fs.readdir(path,callback(err,files))
  • fs.readdirSync(path) // => 返回files

檔案監視

利用檔案監視實現自動 markdown 檔案轉換

  • 相關連結:

    1. https://github.com/chjj/marked
    2. https://github.com/Browsersync/browser-sync
  • 實現思路:
    1. 利用fs模組的檔案監視功能監視指定MD檔案
    2. 當檔案發生變化後,藉助marked包提供的markdown to html功能將改變後的MD檔案轉換為HTML
    3. 再將得到的HTML替換到模版中
    4. 最後利用BrowserSync模組實現瀏覽器自動重新整理
const fs = require('fs');
const path = require('path');
var marked = require('marked');
var bs = require('browser-sync').create();


var target = path.join(__dirname, process.argv[2] || './README.md');
var filename = path.basename(target, path.extname(target)) + '.html';
var targetHtml = path.join(path.dirname(target), filename);

bs.init({
  server: path.dirname(target),
  index: filename,
  notify: false
});

bs.reload(filename);

var template = `<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <style>{{{styles}}}</style>
</head>
<body>
  <article class="markdown">
    {{{body}}}
  </article>
</body>
</html>
`;

fs.readFile(path.join(__dirname, './markdown.css'), 'utf8', (error, css) => {
  if (error) throw error;
  template = template.replace('{{{styles}}}', css);
  var handler = (current, previous) => {
    fs.readFile(target, 'utf8', (error, content) => {
      var html = template.replace('{{{body}}}', marked(content));
      fs.writeFile(targetHtml, html, (error) => {
        if (!error) {
          console.log(`[email protected]${new Date()}`);
          bs.reload(filename);
        }
      });
    });
  };
  handler();
  fs.watchFile(target, { interval: 100 }, handler);
});

緩衝區處理

什麼是緩衝區

  • 緩衝區就是記憶體中操作資料的容器
  • 只是資料容器而已
  • 通過緩衝區可以很方便的操作二進位制資料
  • 而且在大檔案操作時必須有緩衝區

為什麼要有緩衝區

  • JavaScript是比較擅長處理字串,但是早期的應用場景主要用於處理HTML文件,不會有太大篇幅的資料處理,也不會接觸到二進位制的資料。
  • 而在Node中操作資料、網路通訊是沒辦法完全以字串的方式操作的,簡單來說
  • 所以在Node中引入了一個二進位制的緩衝區的實現:Buffer

原文連結:http://blog.wedn.net/node-essential-file-system/

相關推薦

Node基礎檔案操作

檔案操作 相關模組 Node核心提供了很多與檔案操作相關的模組,每個模組都提供了一些最基本的操作API,在NPM中也有社群提供的功能包 fs: 基礎的檔案操作 API path: 提供和路徑相關的操作 API readline: 用於讀取大文字檔案,一行一行讀 fs-extra(第三方): https://w

Python基礎檔案操作

一、檔案操作基本步驟:   一般需要經歷如下步驟: 開啟檔案 操作檔案 示例: #1. 開啟檔案,得到檔案控制代碼並賦值給一個變數 f=open('1.txt','r',encoding='utf-8') #預設開啟模式就為r #2. 通過控制代碼對檔案進行操作 data=f.r

MySQL基礎資料操作

續: 資料操作: 查詢表整體結構  :select * from 表名 增加: 全行(欄位)插入:insert  表名 values(各欄位對應的型別值) 預設插入:      &nbs

linux基礎十二:Redhat7系統中rpm的相關操作與第三方軟體庫的搭建與共享

RPM RPM是Red-Hat Package Manager(RPM軟體包管理器)的縮寫,這一檔案格式名稱雖然打上了RedHat的標誌,但是其原始設計理念是開放式的,現在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分發版本都

Python基礎檔案操作

檔案讀取: 1 #檔案讀取方式一 2 f=open("a.txt","r+",encoding="utf8") 3 data=f.read() 4 print(data) 5 f.close() 6 7 #檔案讀取方式二 8 with open("a.txt","r+",encodi

Node基礎概要

Node簡介 客戶端的JavaScript是怎樣的 什麼是 JavaScript? 指令碼語言 執行在瀏覽器中 一般用來做客戶端頁面的互動(Interactive) JavaScript 的執行環境? 是不是執行在瀏覽器呢? 不夠嚴謹 執行在瀏覽器核心中的 JS 引擎(engine) 瀏覽器中的 J

Node基礎模組和NPM

核心模組 核心模組的意義 如果只是在伺服器執行JavaScript程式碼,意義並不大,因為無法實現任何功能(讀寫檔案,訪問網路)。 Node 的用處在於它本身還提供的一系列功能模組,用於與作業系統互動。 這些核心的功能模組在 Node 中內建。 內建如下模組: path:處理檔案路徑。 fs:操作檔案系

Linux練習題-shell腳本編程基礎施工中

從大到小 最大的 顯示 主機 練習題 shell腳本 空白 分享圖片 目錄備份 1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小2、編寫腳本/root/bin/

python:模組檔案操作

1.模組 1.1模組的概念 模組是python程式架構的一個核心概念 每一個以副檔名 py 結尾的python原始碼檔案都是一個模組 模組名 同樣也是一個識別符號,需要符合識別符號的命名規則 在模組中定義的全域性變數,函式,類都是提供給外界直接使用的工具 模組

linux基礎十四:系統中的磁碟分割槽問題(一)

磁碟資訊查詢 fdisk -l fdisk命令用於觀察硬碟實體使用情況,也可對磁碟進行新增、刪除、轉換分割槽等操作 fdisk -l : 列出指定的外圍裝置的分割槽表狀況 cat /proc/partitions 查詢分割槽資訊,分割槽的大小,掛載點,剩餘空間

linux基礎十五:系統中的磁碟分割槽問題(二)

對分割槽進行加密 操作 1:建立一個分割槽 partprobe 同步分割槽資訊 2:cryptsetup luksFormat /dev/vdb1 ###加密 YES 這裡必須輸入大寫的YES,此處小寫的yes系統不識別,應該是個bug 如果沒有crypt

linux基礎十六:基於Redhat7系統中LVM的相關設定

什麼是LVM LVM是邏輯盤卷管理(Logical Volume Manager)的簡稱,它是Linux環境下對磁碟分割槽進行管理的一種機制,LVM是建立在硬碟和分割槽之上的一個邏輯層,來提高磁碟分割槽管理的靈活性。 LVM的工作原理其實很簡單,它就是通過將底層

linux基礎二十:Redhat7系統中的高階網路配置

Bond 一、簡介 鏈路聚合主動備份網絡卡,當一個網絡卡介面故障時,另一個會接替他的工作,不中斷。bond是將多塊網絡卡虛擬連結成一塊網絡卡的技術,通過bond技術讓多塊網絡卡看起來是一個單獨的乙太網介面裝置並具有相同的ip地址。bond預設情況下支援兩塊網絡卡

面試題目-第一部分 Python基礎80題

第一部分 Python基礎篇(80題) 1. 為什麼學習Python?2. 通過什麼途徑學習的Python?3. Python和Java、PHP、C、C#、C++等其他語言的對比?4. 簡述解釋型和編譯型程式語言? 什麼是編譯型語言和解釋型語言 計算機是不能理解高階語言的,更不能直接

Java學習筆記09--靜態匯入 ;增強for迴圈 ;可變引數 ;自動裝箱與自動拆箱;FILE檔案操作

∆ 靜態匯入: 靜態匯入的作用: 簡化書寫。 靜態匯入可以作用一個類的所有靜態成員。 靜態匯入的格式: import static 包名.類名.靜態的成員; 靜態匯入要注意的事項:

Java基礎四——3——集合介面大比拼

引言:          對比學習——讓學習更加高效! 概述:         本篇部落格重點介紹Java主要介面的區別與聯絡,通過對比理解各個介面的工作原理,以及適用的場合。 內容:        

Java SE 高階開發之Java IO 之 File檔案操作

File檔案操作類 在Java.io包之中,File類是唯一一個與檔案本身操作(建立、刪除、取得資訊..)有關的程式類。 File類的基本使用 java.io.File類是一個普通的類,直接產生例項化物件即可。如果要例項化物件則需要使用到兩個構造方法:

Linux 網路協議棧開發基礎十二—— 使用wireshark分析TCP/IP協議中TCP包頭的格式

摘要: 本文簡單介紹了TCP面向連線理論知識,詳細講述了TCP報文各個欄位含義,並從Wireshark俘獲分組中選取TCP連線建立相關報文段進行分析。 一、概述 TCP是面向連線的可靠傳輸協議,兩個程序互發資料之前需要建立連線,這裡的連線只不過是端系統中分配的一些快

Linux系統程式設計——系統呼叫之 I/O 操作檔案操作

一、檔案描述符 在 Linux 的世界裡,一切裝置皆檔案。我們可以系統呼叫中 I/O 的函式(I:input,輸入;O:output,輸出),對檔案進行相應的操作( open()、close()、write() 、read() 等)。 開啟現存檔案或新建檔案時,系統(核心

MongoDB 基礎安全性許可權操作

和其他所有資料庫一樣,許可權的管理都差不多一樣。mongodb儲存所有的使用者資訊在admin 資料庫的集合system.users中,儲存使用者名稱、密碼和資料庫資訊。mongodb預設不啟用授權認證,只要能連線到該伺服器,就可連線到mongod。若要啟用安全認證,需要更改