UNPKG

wsemi

Version:

A support package for web developer.

110 lines (96 loc) 2.5 kB
import fs from 'fs' import readline from 'readline' import fsIsFile from './fsIsFile.mjs' import evem from './evem.mjs' /** * 使用stream從檔案讀utf8文字 * * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsBuildReadStreamText.test.mjs Github} * @memberOf wsemi * @param {String} fp 輸入讀取檔案路徑字串 * @returns {EventEmitter} 回傳EventEmitter,可監聽create、line、close事件,line事件接收讀入各列字串 * @example * need test in nodejs. * * let test = async () => { * * let ms = [] * * let fdt = './_test_fsBuildReadStreamText' * fsCreateFolder(fdt) //創建臨時任務資料夾 * * let fn = 't1.txt' * let fp = `${fdt}/${fn}` * * fs.writeFileSync(fp, `abc * 測試中文 * def123xyz * `, 'utf8') * * let ev = fsBuildReadStreamText(fp) * ms.push({ 'create': '' }) * * ev.on('line', (line) => { * console.log('line', line) * ms.push({ line }) * }) * * let pm = genPm() * ev.on('close', () => { * console.log('close') * pm.resolve() * ms.push({ 'close': '' }) * }) * await pm * * fsDeleteFolder(fdt) //刪除臨時任務資料夾 * * console.log('ms', ms) * return ms * } * await test() * // ms [ * // { create: '' }, * // { line: 'abc' }, * // { line: '測試中文' }, * // { line: 'def123xyz' }, * // { close: '' } * // ] * */ function fsBuildReadStreamText(fp) { //check if (!fsIsFile(fp)) { throw new Error(`fp is not a file`) } //ev let ev = evem() //stream let stream = fs.createReadStream(fp, { encoding: 'utf8' }) ev.emit('create') //rl let rl = readline.createInterface({ input: stream, crlfDelay: Infinity, //支援\r\n或\n }) //rl line rl.on('line', (line) => { // console.log(`line`,line) ev.emit('line', line) }) // //rl close // rl.on('close', () => { // // console.log('close') // }) //stream close stream.on('close', () => { //stream close事件才代表檔案可刪除 ev.emit('close') }) // //stream end // stream.on('end', () => { // //stream end事件只是讀寫結束, 不代表檔案可刪除 // }) return ev } export default fsBuildReadStreamText