node基础,fs(一)
nodejs实现规范 CommonJS : 规范JavaScript语言作为后端语言运行的标准 具备什么能力,该怎么做 ,比如: 具备服务器的功能/ 可以操作文件 ..... 模块应该怎么写: Module : 1:依赖一个模块 require('模块名(id)') 2: 需要被模块依赖 module.exports = 给外部的数据 3:一个文件是一个模块
#### 核心对象path * 1:`const path = require('path');` * 路径 -> 在处理路径的时候很擅长,但是,其不负责判断路径是否存在文件 * 拼接并修正路径 `path.join(__dirname,'a','b');` 以当前目录/a/b * ```path.resovle('./xxx') 相对转绝对``` * 接收一个合法的路径字符串,转换成一个对象 - `let pathObj = path.parse(mypath);` * 接收一个路径对象,转换成一个字符串路径 - `let str = path.format(pathObj);`
path1.js node path1.js
// 引入核心对象 const path = require('path'); // path没有写路径(核心对象) // path在node.exe里面 // 3段路径来自不同用户的输入 //one// two ///three /// // 拼接路径 const myPath = path.join(__dirname,'//one//','//two//','//three///'); // console.log(myPath); // 前面的绝对路径\one\two\three // 根据相对路径,返回绝对路径 // 对程序说 ./xxx.js 非要一个绝对路径 const str = '.\\abc\\efg.js'; let temp = path.resolve(str); console.log(temp); // 前面的绝对路径\abc\efg.js // 总结,join和resolve函数功能一样,返回绝对路径
path2.js
// 接受一段字符串路径 const path = require('path'); let myPath = path.join(__dirname,'jack','rose','mick.txt'); // 解析这个路径为对象,更易于操作 let pathObj = path.parse(myPath); console.log(pathObj); // base可以作为修改文件名,或后缀的方式 pathObj.base = 'mick_die.good'; // 接收路径对象,转换成路径字符串 myPath = path.format(pathObj); console.log(myPath);
打印pathObj
打印myPath
D:\vue2.5开发去哪儿网\01-Node.js基础+项目实战(18年9月最新)\01-NodeJS基础-第1天-{ 全局、核心对象、异步IO }
\12课 NodeJS基础-第1天-{ 全局、核心对象、异步IO }\01-NodeJS基础-第1天-{ 全局、核心对象、异步IO }\code\jack\rose\mick_die.good
总结
__注意:path对象是方便我们操作路径的,对于获取来讲: parse解析成对象, format转换成字符串. join拼接并修正.... 对于修改路径对象来讲,可以用base属性更改,不能用name,ext更改__
### fs文件模块 - 文件读写 - 其他功能 - 扩展介绍
file.js, 异步读取
// 引入核心对象 fs const fs = require('fs'); //读取文件,读取相对file.js同级的./a.txt文件 fs.readFile('./a.txt','utf8',(err,data)=>{ if (err) throw err; // 抛到控制台显示异常信息 // console.log(data); //buffer类型数据,二进制 // 需要获取字符串数据,就可以调用 buffer篮子.toString(编码)函数,默认urf8可以不传递 console.log(data.toString('utf8')); }); // I or O? // I input 计算机来说,就是输入 // O output 计算机来说 ,展现/写入数据就是输出, // fs.writeFile(path,data||string,callback); // 向a.txt文件写入'我今天赚了2块钱' // {flag:'a'},就是追加数据,没标识就是写入数据 fs.writeFile('./a.txt','我今天赚了2块钱', {flag:'a'},(err)=>{ // window中目录层级超级深的时候,写入会报错 if(err) throw err; console.log('写文件完成了'); }); // 追加方式1: appendFile('path',data,callback); // fs.appendFile('./a.txt','我今天赚了1块钱',(err)=>{ // if(err) throw err; // console.log('文件追加成功'); // });
file2.js, 同步读取
// 引入核心对象 const fs = require('fs'); // 先读后写 (有异常catch) let data = fs.readFileSync('./a.txt','utf8'); console.log(data); // 写入到b.txt(有异常catch) fs.writeFileSync('./b.txt',data); console.log('文件复制成功');
同步和异步区别
node中有两种IO的操作 * 同步IO * 一行代码(读文件)不执行完毕...后续代码不能执行 * 异步IO (建议) * 一行代码(读写文件) 不执行完毕(正在读写中) ... 后续代码也可以执行
const mypath = 'C:/Users/Administrator/Desktop/nba.mp4' const fs = require('fs'); console.log('同步读取前..'); fs.readFileSync(mypath); console.log('工作A...'); //被堵住了,过一会才输出 console.log('读取成功了'); console.log('异步读取前..'); // // 异步读取 fs.readFile(mypath,()=>{ console.log('异步读取后..'); }); console.log('工作B...'); //没有堵住,立刻输出
复习(遍历文件夹下的文件)
-
读取文件夹,获取其中所有文件的资源
-
-
readdir 读取文件夹数据
-
access 判断文件或文件夹是否存在
// 接收命令行参数,根据该目录,读取目录下的所有文件并输出(遍历文件夹) const path = require('path'); const fs = require('fs'); // 1: 接收命令行参数 node ./01_read_dir_files.js .//xxx//xxx//xx // 2: 修正该路径 path.resolve(process.agrv[2]),用户输入路径可能是相对路径 let inputPath = path.resolve(process.argv[2]); // 3: 判断该路径是否存在 fs.access(fs.constants.F_OK) // ./a/b function testReadFiles(dir) { // ./a/b try { // 同步api fs.accessSync(dir, fs.constants.F_OK); //判断该路径文件/文件是否存在 let state = fs.statSync(dir); //获取文件状态 if (state.isFile()) { //是文件 console.log(dir); } else if (state.isDirectory()) { //是文件夹 let files = fs.readdirSync(dir); // 读取文件夹数据,是个文件名数组 // 遍历文件夹,读取子文件 files.forEach( file => { // 递归调用,拼接路劲 testReadFiles(path.join(dir,file)); }); } } catch (e) { console.log(e); console.log('该文件或文件夹不存在!'); } } // 只判断一次 // fs.accessSync(dir, fs.constants.F_OK); testReadFiles(inputPath); //传入文件路劲