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...');  //没有堵住,立刻输出

 

复习(遍历文件夹下的文件)

  • 读取文件夹,获取其中所有文件的资源

  • stat 获取文件状态

  • 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);  //传入文件路劲

 

posted @ 2021-03-09 00:12  全情海洋  阅读(179)  评论(0编辑  收藏  举报