Node基础--day02

1.1 文件读取 fs.readFile()

  • 核心API成员:fs文件操作API;fs模块:file 文件,system 系统;
  • 核心API成员 ,在安装 Node 应用程序时,就已安装到了电脑中;
  • 使用 require(‘核心成员的名称’) 就能导入并使用,核心成员;
//fs.readFile('src',['utf-8'], function (err, data) {} )
// 参数1: 要读取的文件路径
// 参数2: 以什么编码格式来读取,默认 编码格式为 null 
// 参数3: 文件读取完成,调用这个回调函数,来处理读取结果:
//        第一个参数,err对象为 null,读取成功;第二个参数,读取成功后的结果

const fs = require('fs') //导入并使用,核心成员;    
fs.readFile('./files/11.txt', 'utf-8', function (err, data) {
  if (err) {return console.log('读取文件失败:' + err.message)}
  console.log('读取文件成功,内容是' + data) //没有return,会继续执行这语代码
})
结束 返回 带值

1.2 文件写入 fs.writeFile()

//fs.writeFile('src','要写入的内容',['默认为utf-8'], function (err) {} )
//写入成功后的,回调函数;err写入成功 null;写入失败为错误的对象;
//如果要写入的文件,不存在,则直接写入;存在,则覆盖之前的文件;
const fs = require('fs')
fs.writeFile('./files/2.txt', '222', (err) => {
  // 如果文件写入失败,则报错
  if (err) return console.log('写入文件失败!' + err.message)
  console.log('文件写入成功!')
})

1.3 文件追加 fs.appendFile()

//fs.appendFile('src','追加的内容',['默认为utf-8'], function (err) {} )
// 追加内容另起一行 \n,不行用 \r\n,系统问题;追加文件路径不存在,则先创建文件,再追加具体内容;
const fs = require('fs')
fs.appendFile('./files/3.txt', '\n333', (err) => {
  if (err) return console.log('追加文件失败!' + err.message)
  console.log('追加文件成功!')
})

文件只读属性报错

if (err) return console.log(err) 
//Error: EPERM: operation not permitted, open 'D:\Node\node-day2\code\files\1.txt'
//文件不允许读取;3.txt 只读属性,去掉 √ 就可以了;
//写入图片
const fs = require('fs')  
let datas
fs.readFile(__dirname + '/1.png', (err, data) => {
    if (err) return console.log('读取文件失败:' + err.message) 
    console.log('读取文件成功,内容是' + data)
    datas = data
    fs.writeFile(__dirname + '/11.png', datas, (err) => {
        if (err) return console.log('读取文件失败:') //return结束,不再继续执行
        console.log('读取文件成功,内容是')
    })
})
//可以用copyFile,直接复制图片地址if els语句省略了els吗?为什么return后 还能打印err.message

1.4 fs模块中的 路径操作

使用 fs 模块,操作文件时,如果操作的是 相对路径, 则会根据当前,执行 node命令时 的磁盘目录,去拼接,文件的相对路径,容易出问题;例如:

const fs = require('fs')
fs.readFile('./files/1.txt', 'utf-8', (err, data) => { })
//__dirname 表示当前文件,所处的磁盘目录;然后拼接成绝对路径;解决,拼接文件时的路径问题;
fs.readFile(__dirname + '/files/1.txt', 'utf8', ()=>{})//'./files' 加. 会出现路径拼接错误
//__dirname: 当前文件执行时,所处的代码目录;不包含本身的文件名,是一个可变的目录;如果当前文件,放到桌面上执行,则代表桌面目录;
//__filename: 表示当前文件的 完整路径,路径中包含具体的文件名;

1.5 读取指定路径的文件信息 fs.stat()

fs.stat('src',function(err,stats){})//回调函数,两个参数;

fs.stat(__dirname + '/files/1.txt', (err, stats) => {
  if (err) return console.log(err.message)
  console.log(stats.size) // 文件大小 单位是字节
  console.log(stats.birthtime) // 文件创建时间,默认是0时区,当前时间要加8,2018-06-07T10:19:11

  console.log(stats.isFile()) // isFile()方法,判断是否为文件,true/false
  console.log(stats.isDirectory()) // isDirectory() 判断是否为目录,true/false
})   
    
fs.stat(__dirname, (err, stats) => { //__dirname 当前目录
    if (err) return console.log(err.message)
    console.log(stats.size)//0 无法直接读取 目录下的大小
})

1.6 复制文件 fs.copyFile()

//fs.copyFile('src','src',[操作修饰符,默认0], (err)  => {} )
//异步的将 src1 拷贝到 src2,如果 src2 已存在,覆盖;

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

案例:

  1. 整理成绩.txt文件中的数据—>成绩 ok.txt中:

  2. 小红=99 小白=100 小黄=70 小黑=66 小绿=88

     小红:99
     小白:100
     小黄:70
     小黑:66
     小绿:88
    
//步骤:
// 1 fs.readFile 读取文本
// 2 处理成标准格式:
	//split 方法,以空格分割字符串
	//循环数组去掉空格 并把'='换成':' 重新加入新数组
// 3 写入新文本

// 导入 fs 文件操作模块
const fs = require('fs')

fs.readFile(__dirname + '/成绩.txt', 'utf8', (err, dataStr) => {
  if (err) return console.log('读取文件失败:' + err.message)
  let arr = dataStr.split(' ')//'中间敲一个空格'

  let newArr = []
  arr.forEach(item => {
    if (item.length > 0) {
      let newScore = item.replace('=', ':')
      newArr.push(newScore)
    }
  })

  fs.writeFile(__dirname + '/成绩 - ok.txt', newArr.join('\n'), (err) => {
    if (err) return console.log('写入文件失败:' + err.message)
    console.log('处理成绩成功!')
  })
})

2. path模块 路径操作

path.join( [‘路径片段’] )

const path = require('path')
path.join('c:/', 'a', './b/c', 'd', '../f')
// c:\a\b\c\f;..向上翻一层;拼接结果,会被. ..抵消掉;
    
const path = require('path')
const fs = require('fs')
//只要涉及到路径拼接,使用 path.join() 方法,路径前面有点,也不会报错;
fs.readFile(path.join(__dirname, './files/1.txt'), 'utf8', (err, dataStr) => {
  if (err) return console.log(err.message)
  console.log(dataStr)
})
//了解
1. path.sep 平台指定的路径分隔符; 
	  console.log(path.sep)  => \
          
2. path.basename( src路径,[文件扩展名])  获取文件名称
      path.basename('c:/a/b/c/1.txt')  //1.txt 获取文件名;/最后面的内容;
	  path.basename('c:/a/b/c/1.txt','.txt')  //1   
          
3. path.dirname(src) 获取文件所在的路径
      console.log(path.dirname('c:/a/b/c/1.txt')) // c:/a/b/c   
          
4. path.extname(src) 获取文件的扩展名
	  console.log(path.extname('c:/a/b/c/1.txt')) // .txt
    可以把str换成(__filename)

3. Javascript 的单线程和异步

Javascript 的解析和执行是单线程的,但是宿主环境(浏览器或node)是多线程的;才是实现异步的那个;
异步任务是由宿主环境,开启子线程完成,并通过事件驱动、回调函数、队列,把完成的任务, 交给主线程执行;

4. 认识模块化

模块化是一种开发思想;方便了各个模块之间的调用,解决了文件之间的依赖关系;

5. 了解 CommonJS 规范

  • CommonJS 同步加载模块,Node.js中使用,用于服务器端,本地加载;

  • 不适合在浏览器端使用 (AMD/CMD);

  • CommonJS规范都定义了哪些内容:require exports module

6. 模块作用域 和 全局作用域

Node.js中有两个作用域,分别是 全局作用域 和 模块作用域;

  • 全局作用域使用 global 来访问,类似 浏览器中的 window;
  • 每个 JS 文件,都是一个单独模块,都有自己独立的作用域;
    外界 require 这个 JS 文件时,默认 无法访问,文件中的 任何 私有成员;
    在 Node 中,每一个 JS 文件中,定义的 方法、变量,都是属于 模块作用域的;
01.js:
var a = 10 

02.js:
const m1 = require('./01.js') //require 导入模块
console.log(m1) //{}空对象,无法访问

var b = 20
console.log(global.b)
//全局 global 无法访问,模块作用域内的 b; global对象.b,赋值;global.b = b才可以

8.1 使用 global 全局作用域在模块之间共享成员

如果在某个模块内部,想为 全局 global 作用域,挂载一些属性,需要显示的调用 global.* 来挂载;

03.js:
var a = 10
global.b = a//对象.b,赋值 global全局作用域,挂载
function say() {
  console.log('okokok')
}
//global.say = say

04.js:
const m1 = require('./03.模块1.js')// 导入模块
console.log(global.b)//10
global.say()//global不挂载say,仍无法访问

不推荐使用 global 全局作用域,共享成员;会存在全局变量污染的问题;

8.2 模块作用域

  • module(模块标识)
    是一个对象,表示当前具体的 js 模块;module 属性是 Common JS 规范中定义的;

  • require(引用模块)
    require() 函数,方便导入其它 模块中的成员;module.require(‘标识符’) 也是可以的;

  • exports(暴露模块成员)
    模块中,通过 exports对象,把模块内的私有成员,暴露给外界使用;
    exports 是 module 中的一个属性,默认是一个空对象;默认向外暴露成员,需要使用 module.exports;

m1.js
var a = 10
//exports.a = a
//向外暴露方法: exports.say = say 方法名;
    
m2.js
const m1 = require('m1.js')
console.log(m1) //{}空对象;
//console.log(m1) --> {a: 10}

8.3 module.exports 和 exports 的关系

  • module.exports 和 exports 默认引用了同一个空对象;都可以向外暴露成员;

  • 一个模块作用域中,向外暴露私有成员时,永远以 module.exports 为准;(此时 exports 可能不生效)

//m1.js
console.log(module.exports === exports) //true      
var a = 10
var b = 20
exports = a //直接赋值;对象.属性 = 为属性赋值;
module.exports = b 
//console.log(m1) --> 20;向外暴露私有成员时,以 module.exports 指向的地址,为准; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值