一、 文件操作

文件操作分为两个部分,一部分是操作文件中的数据,对文件的读取和写入。另一部分是文件的解构操作,对文件夹的读取、创建、删除和对文件的删除、移动、更名。

文件操作基于fs核心模块,所有的方法都有两个,一个同步一个异步。

区别:同步方法在使用的时候在异步方法后面加上Sync,他比异步方法多一个返回值。
异步方法比同步方法多传递一个参数(回调函数)

1、文件的数据操作

1.文件的读取
readFile();异步文件读取方法。
参数有两个或三个:

  1. 文件的路径。
  2. 可选参。字符集。若传递返回字符串,不传返回时buffer(一般读取图片时不会传递)
  3. 回调函数,内置两个参数,第一个是读取的错误,第二个是读取成功的数据。

readFileSync():同步文件读取方式。
参数有一个或两个:

  1. 文件的路径。
  2. 可选参。字符集。若传递返回字符串,不传返回时buffer(一般读取图片时不会传递)
    : 同步没有回调函数,返回值是读取成功获得的数据。

同步方法在使用的时候在异步方法后面加上Sync,他比异步方法多一个返回值。
异步方法比同步方法多传递一个参数(回调函数)。
下面只介绍一种方法,但都有两种方式,区别一样

const fs = require('fs');
// console.log(fs);
/*
读取文件使用readFile方法内置两个或者三个参数第一个参数是文件的路径第二个参数可选  是字符集  如果说传递第二个参数  返回字符串  如果说  不传递  那么返回是Buffer一般情况下  我们读取图片的时候  不会传递第二个参数第三个参数是回调函数  回调内置两个参数  第一个参数是读取的错误  第二个参数是读取的数据
*/
// 内置三个参数的时候
fs.readFile('../text/document.txt','utf-8',(error,data)=>{// if (error) console.log('读取失败');// else console.log(data);error ? console.log('读取失败') : console.log(data);
})
// 内置两个参数的时候
fs.readFile('../text/document.txt',(error,data)=>{if (error) console.log('读取失败');else console.log(data.toString());
})
// 使用同步方法
let result  = fs.readFileSync('../text/document.txt','utf-8');
console.log(result);

2.文件的写入

1.同步写入 最直观

​ 涉及到三个方法

​ openSync : 打开文件

​ writeSync : 写入文件

​ closeSync : 关闭文件

const fs = require('fs');/*
openSync  :  打开文件内置三个参数第一个参数是文件的路径第二个参数是打开的方式   r  w  ar  :  只读方式打开w  :  写入方式打开  覆盖写a  :  写入方式打开  追加写第三个参数是打开文件的权限  一般不会传递返回值是资源句柄
*/let fd = fs.openSync('../text/sync.txt', 'w');
// let fd = fs.openSync('../text/sync.txt','a');
// console.log(fd);
// 编辑一个写入的内容
let str = "我爱北京天安门  天安门上红旗升\n";/*
writeSync  :  写入文件内置四个参数第一个参数是资源句柄第二个参数是写入的内容第三个参数字符集第四个参数是是写入的起始位置  一般不会传递  因为一般情况下覆盖写比较多
*/
fs.writeSync(fd, str, 'utf-8');/*
closeSync  :  关闭文件内置一个参数参数是资源句柄
*/
fs.closeSync(fd);

2.异步写入 最Node

​ 涉及到三个方法

​ open : 打开文件

​ write : 写入文件

​ close : 关闭文件

const fs = require('fs');/*
open  :  打开文件内置四个参数第一个参数是文件的路径第二个参数是打开的方式   r  w  ar  :  只读方式打开w  :  写入方式打开  覆盖写a  :  写入方式打开  追加写第三个参数是打开文件的权限  一般不会传递第四个参数是回调函数  回调内置两个参数第一个参数是错误第二个参数是资源句柄
*/
// 定义一句写入的内容
let str = "葡萄酒  金魄罗  无极十五级孖拖";fs.open('../text/async.txt', 'w', (error, fd) => {if (error) {console.log('打开失败');} else {/*write  :  写入文件内置五个参数第一个参数是资源句柄第二个参数是写入的内容第三个参数字符集第四个参数是是写入的起始位置  一般不会传递  因为一般情况下覆盖写比较多第五个参数是回调函数  回调内置一个参数  参数是错误*/fs.write(fd, str, 'utf-8', error => {if (error) {console.log('写入失败');} else {console.log('写入成功');}})/*close  :  关闭文件内置两个个参数第一个参数是资源句柄第二个参数是回调  回调内置一个参数  参数是错误*/fs.close(fd,error=>{if (error) console.log('关闭失败');else console.log('关闭成功');})}
})

3.简单写入 最简单

​ 简单写入的方式是最常用的方式 因为简单写入和读取差不多 只是涉及到一个方法,而且不需要关闭资源和打开资源 直接使用就可以

​ 涉及到的方法 writeFile

​ 同步方法 writeFileSync

const fs = require('fs');/*
涉及到的方法  writeFile
同步方法  writeFileSync内置四个参数第一个参数是文件的路径第二个参数是写入的内容第三个参数是描述  描述是一个对象  对象中有打开方式  字符集第四个参数是回调函数回调内置一个参数  参数是错误
*/
let book = [{book_id:1,book_name:'史记',book_price:66,book_page:600,book_author:'司马迁'},{book_id:2,book_name:'资治通鉴',book_price:88,book_page:1200,book_author:'司马光'},{book_id:3,book_name:'全球通史',book_price:72,book_page:800,book_author:'斯塔夫里阿诺斯'},{book_id:4,book_name:'万历十五年',book_price:36,book_page:700,book_author:'黄仁宇'},{book_id:5,book_name:'本草纲目',book_price:76,book_page:900,book_author:'李时珍'},{book_id:6,book_name:'论语',book_price:32,book_page:360,book_author:'曾参,有若'}
];// 写入的数据必须是一个字符串
// fs.writeFile('../text/easy.json',JSON.stringify(book),{flag:'w',encoding:'utf-8'},error=>{//     if (error){//         console.log('写入失败');
//     }else{//         console.log('写入成功');
//     }
// })let obj = {book_id:7,book_name:'孙子兵法',book_price:25,book_page:350,book_author:'孙武子'};// 选获取出所有数据
let bookArr = JSON.parse(fs.readFileSync('../text/easy.json','utf-8'));bookArr.push(obj);fs.writeFileSync('../text/easy.json',JSON.stringify(bookArr),{flag:'w',encoding:'utf-8'});

4.流式写入 最特殊

流式写入方式相对来说最为特殊 因为流式写入方式需要创建一个可写的流,平时流式应用特别少 只要在特定的时候 才会使用流式操作

一般情况下 前三种方式不适合大规模数量的数据写入操作 一般都是使用前三中方式,在大规模数据写入的时候 一般情况下都会选择流式写入。所以说 使用流式写入方式 我们一般都选择使用追加写

流式写入使用事件驱动 open事件和close事件

涉及到方法三个

createWriteStream : 创建一个可写的流

write : 写入方法

end : 结束方法

open事件 : 打开可写的流

close事件 : 关闭可写的流

const fs = require('fs');// 使用createWriteStream该方法创建一个可写的流
// 内置两个参数  第一个参数是文件的路径  第二个参数是描述  字符集和打开方式
// 返回值是一个对象资源
let ws = fs.createWriteStream('../text/staeam.txt',{encoding:'utf-8',flags:'a'});// 使用ws中的on方法触发open事件
ws.on('open',()=>{console.log('打开了流');
})// 写入操作
// 使用write方法进行写入数据
// ws.write('第1次想你');
for (let i = 1; i <= 100000; i++){ws.write(`今天是我第${i}次想你\n`);
}// 关闭了流
ws.on('close',()=>{console.log('关闭了流');
})// 结束必须调用end方法  要不然程序一直都不会进行结束
ws.end();

2.文件的解构操作

1.读取文件夹

​ 方法 : readdir读取文件夹信息

const fs = require('fs');/*
方法  : readdir读取文件夹信息
内置两个参数第一个参数是文件夹的路径第二个参数是回调函数回调内置两个参数  第一个参数是错误  第二个参数是读取的结果返回的是一个数组  数组中的数据是文件夹中所有的文件和文件夹
*/
// 异步方法
fs.readdir('../text',(error,data)=>{if (error){console.log('读取失败');}else{console.log(data);}
})
// 同步方法
let result = fs.readdirSync('../text/aa');
console.log(result);

2.读取文件或文件夹

​ 方法 : 使用stat方法读取文件或者文件夹的信息

const fs = require('fs');/*
方法  : stat读取文件或者文件夹信息
内置两个参数第一个参数是文件或者文件夹的路径第二个参数是回调函数回调内置两个参数  第一个参数是错误  第二个参数是读取的结果返回的是一个对象  对象是信息
*/// fs.stat('../text/staeam.txt',(error,data)=>{fs.stat('../text',(error,data)=>{if (error){console.log('读取失败');}else{console.log(data);console.log(data.isFile());}
})
let result = fs.statSync('../text/aa/aa.txt');
console.log(result);
console.log(result.isFile());

3.创建文件夹

​ 方法 : mkdir创建文件夹 但是不能层级创建

const fs = require('fs');/*
方法  :  mkdir创建文件夹   但是不能层级创建
内置两个或者三个参数第一个参数是创建文件夹的路径第二个参数是  可选  是否递归创建第三个参数是回调函数  回调内置一个参数  参数是错误
*/// 传递两个参数  创建单层目录
// fs.mkdir('../text/bb',error=>{//     if (error) console.log('创建失败');
//     else console.log('创建成功');
// })// 传递三个参数  创建层级目录
fs.mkdir('../text/cc/dd/ee/ff',{recursive:true},error=>{if (error) console.log('创建失败');else console.log('创建成功');
})

4.删除文件夹

​ 方法 : rmdir创建文件夹 但是不能层级删除 只能删除空文件夹

const fs = require('fs');/*
方法  :  rmdir删除文件夹   但是不能层级删除
内置两个或者三个参数第一个参数是删除文件夹的路径第二个参数是  可选  是否递归删除  可以删除非空目录第三个参数是回调函数  回调内置一个参数  参数是错误
*/// 传递两个参数  删除单层目录
// fs.rmdir('../text/bb',error=>{//     if (error) console.log('删除失败');
//     else console.log('删除成功');
// })// 传递三个参数  删除层级目录
fs.rmdir('../text/cc',{recursive:true},error=>{if (error) console.log('删除失败');else console.log('删除成功');
})

5.删除文件

​ 方法 : unlink

const fs = require('fs');/*
方法  :  unlink
内置两个参数第一个参数是删除的文件路径第二个参数是回调函数回调内置一个参数  参数是错误
*/// 异步方法
// fs.unlink('../text/aa/aa.txt',error=>{//     if (error) console.log('删除失败');
//     else console.log('删除成功');
// })// 同步方法
fs.unlinkSync('../text/aa/a.txt');

6.文件移动更名

​ 方法 : rename移动文件或者对文件更名 或者移动+更名

const fs = require('fs');/*
方法  :  rename移动文件或者对文件更名  或者移动+更名
内置三个参数第一个参数是移动前的路径 + 文件名第二个参数是要移动到的路径 + 文件名第三个参数是回调函数回调内置一个参数  参数是错误
*/
// fs.rename('../text/aa.jpg','./1.jpg',error=>{//     if (error) console.log('移动失败');
//     else console.log('移动成功');
// })fs.renameSync('./1.jpg','../text/aa.jpg');

二.url模块

​ URL模块是核心模块,URL模块主要有一个方法 其实就是使用URL中的parse方法。这个方法 主要就是将我们URL转化成对象形式 方便我们解析参数、解析路径、解析请求位置

​ url : 统一资源定位符 统一资源定位器 统一资源定位系统

​ URL共分为六个部分

​ 协议 : http:// https://

​ 域名 : www.baidu.com www.ujiuye.com www.offcn.com

​ 端口 : :3000 : 5000

​ 路径 : /index.html

​ 参数 : ?name=zhang ?name=kang&age=18

​ 锚点 :

const url = require('url');// console.log(url);
// 定义两个路径
let str1 = 'https://www.baodu.com:443/index.html?name=kang';
let str2 = 'http://www.ujiuye.com:80/jiaoxue/pxsz/index.html?name=Eric';console.log(url.parse(str1));
/*Url {protocol: 'https:',host: 'www.baodu.com:443',port: '443',hostname: 'www.baodu.com',search: '?name=kang',query: 'name=kang',pathname: '/index.html',path: '/index.html?name=kang',href: 'https://www.baodu.com:443/index.html?name=kang'}
*/console.log(url.parse(str2));
/*Url {protocol: 'http:',host: 'www.ujiuye.com:80',port: '80',hostname: 'www.ujiuye.com',search: '?name=Eric',query: 'name=Eric',pathname: '/jiaoxue/pxsz/index.html',path: '/jiaoxue/pxsz/index.html?name=Eric',href: 'http://www.ujiuye.com:80/jiaoxue/pxsz/index.html?name=Eric'}
*/ 

三.path模块

basename : 获取路径最后一部分

delimiter : 返回语句的定界符

isAbsolute : 判断路径是否为绝对路径

dirname : 获取路径中文件夹部分

extname : 获取路径中文件扩展名

parse : 格式化路径, 获取每一部分的值

join : 连接路径 连接成相对路径

resolve : 连接路径 连接成绝对路径

const path = require('path');
const url = require('url');let str1 = 'https://www.baodu.com:443/index.html?name=kang';
let str2 = 'http://www.ujiuye.com:80/jiaoxue/pxsz/index.html?name=Eric';
let str3 = 'https://www.baodu.com:443/index.html';// basename: 获取路径最后一部分  其实就是请求的文件名字加上路径
console.log(path.basename(str1));
console.log(path.basename(str2));
console.log(path.basename(str3));
console.log('*'.repeat(66));// delimiter  :  返回语句的定界符  最鸡肋
console.log(path.delimiter);
console.log('*'.repeat(66));// isAbsolute  :  判断路径是否为绝对路径  这个方法判定的时候  只有从盘符开始的才算绝对路径
console.log(path.isAbsolute(str1));
console.log(path.isAbsolute(str2));
console.log(path.isAbsolute(str3));
console.log(path.isAbsolute('C:/a/b'));
console.log(path.isAbsolute('Z:/a/b'));
console.log(path.isAbsolute('A:/a/b'));
console.log('*'.repeat(66));// dirname: 获取路径中文件夹部分  他和basename组成了完整的URL
console.log(path.dirname(str1));
console.log(path.dirname(str2));
console.log(path.dirname(str3));
console.log('*'.repeat(66));// extname: 获取路径中文件扩展名  取出字符串中最后一个点右面的内容
console.log(path.extname(str1));
console.log(path.extname(str2));
console.log(path.extname(str3));
console.log(path.extname('ABC.jpg'));
console.log(path.extname('ABC.'));
console.log(path.extname('ABC'));
console.log(path.extname(url.parse(str2).pathname));
console.log('*'.repeat(66));// parse: 格式化路径, 获取每一部分的值
console.log(path.parse(str2));
console.log('*'.repeat(66));// join  :  连接路径  连接成相对路径  若干参数  把所有参数连接在一起  组成一个新的路径
console.log(path.join('./a/b','c','d'));
console.log(path.join('./a/b','../c','d'));
console.log(path.join(__dirname,'./a/b','../c','d'));
console.log('*'.repeat(66));// resolve  :  连接路径  连接成绝对路径
console.log(path.resolve('./a/b','../c','d'));
console.log(path.resolve(__dirname,'./a/b','../c','d'));

NodeJS文件操作和URL、path模块相关推荐

  1. NodeJS 文件操作 —— fs 基本使用

    阅读原文 fs 概述 在 NodeJS 中,所有与文件操作都是通过 fs 核心模块来实现的,包括文件目录的创建.删除.查询以及文件的读取和写入,在 fs 模块中,所有的方法都分为同步和异步两种实现,具 ...

  2. python引入文件并执行_文件操作和导入os模块执行文件和目录管理操作

    文件概念以及文本文件和二进制文件的区别 计算机的CPU如果想要访问保存在磁盘上的文件,第一步需要把磁盘上的文件数据加载到内存中.因为内存的读写速度要比磁盘的读写速度快很多. 计算机只能识别0101这种 ...

  3. Python初级学习教程—从入门开始学习(函数、组合数据类型、文件操作、异常、模块)

    文章目录 入门 一.数据的相关操作 二.continue 和 break的区别(易混点) 三.函数 变量的作用域 三.函数进阶 1.函数多个返回值 2.函数参数种类 3.匿名函数 组合数据类型 一.列 ...

  4. devi into python 笔记(五)异常 文件操作 sys os glob模块简单实用

    异常: Java异常: try catch块处理异常,throw引发异常. Python异常: try except块处理异常,raise引发异常. 异常如果不主动处理,则会交给Python中的缺省处 ...

  5. Nodejs文件操作学习

    Nodejs学习笔记 中文文档-API 文档 | Node.js 中文网 (nodejs.cn) 官方教程-Node.js 简介 (nodejs.cn) Node.js是一个基于V8 JavaScri ...

  6. 07.nodejs文件操作

    const fs = require('fs') const path = require('path')const fileName = path.resolve(__dirname, 'data. ...

  7. python中os模块详解_Python OS模块(常见文件操作示例)

    1 Python 常见文件操作示例 2. 3. os.path 模块中的路径名访问函数 4. 分隔 5. basename() 去掉目录路径 , 返回文件名 6. dirname() 去掉文件名 , ...

  8. D14.系统模块和文件操作

    系统模块和文件操作 一,time模块 from time import * 1. time() - 获取当前时间的时间戳 2. localtime() - 获取本地的当前时间,返回值是结构体时间 lo ...

  9. 自动化运维---ansible常用模块之文件操作(findreplace模块)

    自动化运维-ansible常用模块之文件操作(find&replace模块) 文章目录 自动化运维---ansible常用模块之文件操作(find&replace模块) 1.find模 ...

最新文章

  1. 橡胶支座抗压弹性模量计算公式_囊谦网架生态酒店_网架抗震垫块A诚信商家-桥兴橡胶...
  2. UART接口与COM口的区别
  3. shell input value from console
  4. Squid正向代理矩阵
  5. 创业公司产品经理如何画好原型图
  6. OpenCV霍夫圈检测Hough Circle Detection的实例(附完整代码)
  7. trident API指南
  8. EditText修改光标和背景色(绝对简单实用)
  9. ctr多少正常_亚马逊广告ctr多少才算合格,如何提升亚马逊CTR
  10. 83年的我刚好今年遇到了失业
  11. vs 堆栈保留大小_新娘妆前vs妆后!看过就知道化妆师的重要性了!
  12. Kickstart+HTTP+DHCP+TFTP全自动批量安装部署Linux系统
  13. GIF图形文件格式文档
  14. OCI 完成 TOB 选举,阿里工程师入选全球 9 人名单
  15. SEGGER J-Flash烧写SN号(serial number)的两种方式
  16. 【TL431】TL431精密电压调节器简介
  17. F检验临界值表(Frideman检验表)
  18. CVPR2021 视频目标检测论文推荐
  19. 解决ios的webview中上/下拉露出黑灰色背景问题
  20. 如何用photoshop切图并去掉图片上面的文字

热门文章

  1. python每隔5秒执行一次
  2. 树莓派3SD卡格式化-Windows下利用SDFormatter格式化SD卡
  3. 2022年合束器市场前景分析及研究报告
  4. Eclipse开发项目,“猥皮恩“连接,发布到现场
  5. Windows 64位下载安装My SQL
  6. Kibana自动刷新设置
  7. 和Stand-up再次相遇
  8. VMWare的P2V、V2V使用
  9. NKOJ 小凯的疑惑 Plus
  10. ACPI Tables