Node笔记--------fs文件模块

fs是filesystem的缩写,基本上就是node对于文件系统操作封装的一些api

一、文件的读写

文件的读写这里面的api有readFile(),writeFile(),和readFileSync(),writeFileSync()。前者是异步,后者是同步,两种不同的情况供开发者选择。

readFile()和readFileSync()

readFile用于异步读取数据,他有几个参数:

参数 是否必须 例子 作用
文件的路径 './image.png' 可以是绝对路径,也可是相对路径,如果是相对路径,是相对于当前进程所在的路径 process.cwd(),官方文档上好像写也可以传一个buffer......还能是文件名和文件描述符(不知道是什么东西)
options配置 'utf-8' 可以配置文件编码实例,默认是utf-8
读取完成后的回调参数 func (err, buffer) { } 该函数一参是发生错误时的错误对象,二参是代表文件内容的buffer实例

如果,文件的路径是一个目录,会返回一个错误......freeBSD不会,好像基于平台.....
同步的方法readFileSync()和这个一样,使用的例子如下

const text = fs.readFile('etc/passws', 'utf-8' (error, buffer) => {
    if(error) throw err
    console.log(buffer) 
  }) {
}
//将文件按行拆成数组......
text.split(/\r?\n/).forEach((item) => {
  console.log(item)
})
writeFile()和writeFileSync()

用于写入文件。

参数 是否必须 例子 作用
文件路径 上同 上同
写入的字符串或文件 'hello’ 可以是字符串,也可以是文件名,还可以是buffer
option配置 上同 上同
写入完成时的回调 上同 上同
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

这里的官方文档上写了注意......多次对同一文件使用,而且不等待回调函数,是不安全的,对于多次写入同一文件,强烈建议使用fs.createWriteStream

fs.createWriteStream()

这个方法,创建了一个写入数据流的对象,该对象的write方法用于写入数据,end方法用于结束写入操作.....

const out = fs.createWriteStream(fileName, {
  flags: 'w',
  encoding: 'utf8',
  fd: null,
  mode: 0o666,
  autoClose: true
})
out.write(str)
out.end()
参数 是否必须 作用
文件路径
options 一些配置,具体的配置有flags:一个string,大概是写入的模式比如w,r+等,encoding:编码;fd;mode;autoClose:设置是否自动关闭;start:一个integer

注意: 如果autoClose设置为true(默认),则在遇到error和end的时候,会自动关闭,如果是false,即使有错误,也不会被关闭,所以要注意了,你要正确的负责关闭。,并确保文件描述符没有泄露, fd和mode暂时还不知道它的作用。

如果要对统一文件进行反复的读写,知道一直不停的out.write()就可以了,最后别忘记end()

相对的createWriteStream和它一样使用,但是它会返回一个ReadStream可读流对象。而且它第二个参数options中对了一个end字段。

fs.createReadStream('sample.txt', { start: 90, end: 99 });
// 设置了start和end之后,使其可以从文件读取一定范围的字节而不是整个文件
createWriteStream和createReadSteam结合使用拷贝大文件实例
const fileCopy = (filename1, filename2, done) => {
  let input = fs.createReadStream(filename1);
  let output = fs.createWriteStream(filename2);

  input.on('data', function(d) { output.write(d) }) 
  input.on('error', function(error) { throw error }) 
  input.on('end', function() {
    output.end()
    if (done) done();
  }) 
}

二、文件的操作

exist() 、mkdir()

exist()判断文件目录是否存在,他的回调函数参数,是不管最后结果如何都会调用的,需要注意的是,以前我们写java的文件IO,在打开文件的时候都需要先用类似方法判断目录是否存在,但是node里边,open方法本身就能检查,
mkdir()用于新建目录,它接收三个参数,目录名、权限值和回调函数

const fs = require('fs');
// 如果给定目录存在,就删除它。
if(fs.existSync(outputFolder)) {
  console.log('删除' + outputFolder)
  fs.rmdirSync(outputFolder)
}
//  新建目录
fs.mkdir('./helloDir',0777, function (err) {
  if (err) throw err;
});
stat()

它用来判断是一个文件还是一个目录,接收一个文件或者目录。

watch()
参数 是否必须 作用
文件名
options参数 fou 如果指定,则是一个对象,包括persistet:布尔值(默认true),表明文件被监控时,进程是否还要继续运行; recursive:指明是否全部子目录应该被监视,或只是当前目录(默认false);encoding:默认utf-8

监控文件,如果文件发生变化,则触发回调函数。返回的是一个fs.FSWatch

参数 是否必须 作用
文件名
options参数 fou 如果指定,则是一个对象,包括persistet:布尔值(默认true),表明文件被监控时,进程是否还要继续运行; recursive:指明是否全部子目录应该被监视,或只是当前目录(默认false);encoding:默认utf-8
fs.watch('somedir', (eventType, filename) => {
  console.log(`事件类型是: ${eventType}`);
  if (filename) {
    console.log(`提供的文件名: ${filename}`);
  } else {
    console.log('未提供文件名');
  }
});

注意,还有一个watchFile(),作用和它差不多,效率低,官方建议用这个。但fs.watch API 不是 100% 跨平台一致的,且在某些情况下不可用。递归选项只支持 macOS 和 Windows

fs.lstat(path)

接收一个文件url,返回一个fs.Stats实例,他的同步方法是fs.lstatSync(path)

三、webpack应用,写一个多入口的初始化entry函数

在使用开发react应用的时候,使用webpack打包需要有多入口的时候,也就是说,我有多个entry,每个enrty各自生成一个html模版,这个时候,我们可以写个自动脚本,如下

const _ = require('lodash')
const HtmlWebpackPlugin = require('html-webpack-plugin')

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

const entryDir = path.join(__dirname, 'src/entry/')
const templateFile = path.join(__dirname, 'index.html')


const addEntryFn = (config, key, value) => {
  console.log(`找到了entry!,key=${key},value=${value}`);
  config.entry[key] = value
  config.plugins.push(new HtmlWebpackPlugin(
    {
      title: key,
      filename: key + '.html',
      chunks: [key],
      template: templateFile,
      multihtmlCache: true,
    }
  ))
}

const getEntrys = (config, rootpath, fn) => {
  const files = fs.readdirSync(rootpath)
  for(let key in files) {
    const fullName = path.join(rootpath, "/", files[key])
    const stat = fs.lstatSync(fullName)
    if (stat.isDirectory()) {
      getEntrys(config, fullName, fn)
    } else {
      const fileName = path.basename(fullName, '.jsx')
      if (_.startsWith(fileName, 'entry-')) {
        const entryKey = fileName.replace('entry-', '')
        fn(config, entryKey, fullName)
      }
    }
  }
}

 module.exports = function (config) {
  getEntrys(config, entryDir, addEntryFn);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容