Node-核心模块(fs、path)

一、核心模块fs

1、文件读取

使用 Node 中 提供的 文件操作API,读取指定 文件中的文本内容

  • Node 的三个组成部分: ECMAScript 核心 + 全局成员 + 核心API成员
  • 核心API成员 ,在安装 Node 应用程序的时候,就已经安装到了 自己的 电脑中;
  • 如果想要访问 核心成员,直接使用 require('核心成员的名称') 就能够导入并使用这些核心成员;

1.1. 导入 fs 文件操作模块

const fs = require('fs');

fs 核心模块中,提供了一个 fs.readFile 方法,来读取指定目录下的文件

fs.readFile()

2.2. 调用 fs.writeFile 写入文件

fs.readFile 有三个参数:
参数1: 表示 要读取的文件的路径
参数2: 表示 要以什么样的编码格式,来读取指定的文件 默认 编码格式为 null
参数3: 表示 当文件读取完成,调用这个 callback 回调函数来处理读取的结果:
第一个 参数,是 Error 对象,第二个参数,才是读取成功的结果

fs.readFile('./files/1.txt', 'utf-8', function(err, data) {
    if (err) return console.log('读取文件失败:' + err.message);
    console.log('读取文件成功,内容是' + data);
})

2、文件写入

调用 fs.writeFile 方法,将内容 写入指定文件中

2.1. 导入 fs 文件操作模块

const fs = require('fs')

2.2. 调用 fs.writeFile 写入文件

参数1: 路径字符串,表示要把文件内容,写入到哪个文件中
参数2: 要写入的数据,可以给定一个 字符串
参数3: 可选参数,表示 要以什么格式写入文件内容 默认以 utf8 格式写入文件【一般默认不传递第三个参数】
参数4: 文件写入完成之后的 callback 回调函数 ,在回调函数中,只有一个形参,err 错误对象

fs.writeFile('./files/2.txt', '222', (err) => {
    // 如果文件写入失败,则报错
    if (err) return console.log('写入文件失败!' + err.message);
    console.log('文件写入成功!');
})

如果在使用 fs.writeFile 的时候,要写入的文件不存在,则直接写入;如果要写入的文件路径已经存在,则会覆盖之前的文件;

3、文件追加

3.1. 导入 fs 文件操作模块

const fs = require('fs')

3.2. 调用 fs.appendFile 追加文件内容

参数1: 表示要向哪个文件中追加内容,指定一个文件的路径
参数2: 表示要追加的具体的内容,可以传递字符串内容
参数3: 可选参数;表示 追加文本内容时候的编码格式,如果省略此参数,默认以 utf8 的格式追加内容
参数4: 表示 追加完成之后的回调,有形参 err ,追加失败之后的错误结果

fs.appendFile('./files/3.txt', '\n333', (err) => {
    if (err) return console.log('追加文件失败!' + err.message);
    console.log('追加文件成功!');
})

如果要追加的文件路径不存在,则会先尝试创建这个文件,然后再向创建的文件中,追加具体的内容;

4、__dirname

在node的js代码中使用相对路径 ,有时候会出现找不到文件的问题,这是因为在node中计算相对路径与web中不一样,web是相对于项目根目录计算路径,node中是相对于终端运行目录去计算的。

ENOENT: no such file or directory, open 'C:\Users\xxx\files\1.txt'

__dirname :表示当前执行 js文件所属目录绝对路径,注意是目录 ,通过拼接可以获得要操作文件的绝对路径。
之前写的追加示例代码可以替换成:

fs.appendFile(__dirname + '/files/3.txt', '\n333', (err) => {
    if (err) return console.log('追加文件失败!' + err.message);
    console.log('追加文件成功!');
})

在使用 fs 模块操作文件,且这个方法需要提供文件的路径,一定要使用 __dirname 去拼接路径;

5、__filename

__dirname :表示 当前执行js文件绝对路径

6、fs-获取指定路径的信息

语法:

fs.stat(path,callback);

fs.stat(__dirname + '/files/1.txt', (err, stats) => {
    if (err) return console.log(err.message);
    console.log(stats.size); // 字节(Byte)
    console.log(stats.birthtime); // 2018-06-07T10:19:11.186Z 零时区
    console.log(stats.isFile()); // isFile() 判断是否为 文件
    console.log(stats.isDirectory()); // isDirectory() 判断是否为目录
})

7、复制文件

语法

fs.copyFile(oldPath,newPath,callback)

fs.copyFile(__dirname + '/files/1.txt', __dirname + '/files/1-copy.txt', (err) => {
    if (err) return console.log('拷贝失败:' + err.message);
    console.log('拷贝成功!');
})

如果目标文件已存在,则覆盖。

二、核心模块path

1、path路径模块基本用法

path.join()

导入path模块
const path = require("path");

path.join() 每个参数相对于前一个参数进行规范化拼接。
识别../ 和 ./ ,可以和终端一样返回上一级或当前目录

例如:

path.join("/foo","bar","baz/asdf","quux","..");
// 返回值为:"/foo/bar/baz/asdf"
const path = require('path');  //导入 path 模块
const fs = require('fs'); //导入 fs 模块

const result = path.join('c:/', 'a', './b', '/c', './d/e', 'f', '../g');
console.log(result); // c:\a\b\c\d\e\g 

// 手动拼接路径
fs.readFile(__dirname + '/files/1.txt', 'utf8', (err, dataStr) => {
    if (err) return console.log(err.message);
    console.log(dataStr);
});

// path.join() 拼接路径
fs.readFile(path.join(__dirname, '/files/1.txt'), 'utf8', (err, dataStr) => {
    if (err) return console.log(err.message);
    console.log(dataStr);
});

以后只要涉及到路径拼接,一定要使用 path.join() 方法

2、其他用法

  • path.sep 路径分隔符
  • path.basename(str) 获取文件名称
  • path.dirname(str) 获取文件所在的路径
  • path.extname(str) 获取文件的扩展名
const path = require('path');

// console.log(path.sep); // 路径分隔符

const str = 'c:/a/b/c/1.txt';

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

推荐阅读更多精彩内容