参考:https://www.runoob.com/nodejs/nodejs-fs.html

异步I/O 1,文件操作 2,网络操作

在浏览器中也存在异步操作 1,定时任务 2,事件处理 3,Ajax回调处理

js的运行是单线程的,引入事件队列机制,进入事件队列的任务主要分两种: Node.js中异步执行的任务:1,文件读写操作(文件I/O) 2,网络的请求相应处理(网络I/O)

Node.js中的事件模型与浏览器中的事件模型类型:单线程+事件队列,js的运行是单线程的,Node.js的环境是多线程的

一、获取文件信息

通过异步模式获取文件信息的语法格式

fs.stat(path, callback)

fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:

常用方法:

stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
var fs = require('fs');
fs.stat('01.js', function(err, stats) {
if(err) return;
console.log(stats);
if(stats.isFile()){
console.log('文件');
} else if(stats.isDirectory()){
console.log('目录');
}
});

返回结果:

atime  文件访问时间

ctime 文件状态信息发生变化的时间,比如文件的权限

mtime文件数据发生变化的时间

birthtime文件创建时间

Stats {
dev: 3963844000,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 7599824371308861,
size: 326,
blocks: 0,
atimeMs: 1621577436001.767,
mtimeMs: 1621577434724.8518,
ctimeMs: 1621577434728.6726,
birthtimeMs: 1621505236836.661,
atime: 2021-05-21T06:10:36.002Z,
mtime: 2021-05-21T06:10:34.725Z,
ctime: 2021-05-21T06:10:34.729Z,
birthtime: 2021-05-20T10:07:16.837Z
}
文件

二、读文件操作

var path = require('path');
var strpath = path.join(__dirname, '02.json');
// 如果没有设置编码方式,那么得到的是Buffer对象,需要进行转换
fs.readFile(strpath, 'utf-8', function(err, data){
console.log(data);
});

三、写文件操作

异步模式下写入文件的语法格式:

fs.writeFile(file, data[, options], callback)

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。

var fs = require("fs");

console.log("准备写入文件");
fs.writeFile('input.txt', '我是通 过fs.writeFile 写入文件的内容', function(err) {
if (err) {
return console.error(err);
}
console.log("数据写入成功!");
console.log("--------我是分割线-------------")
console.log("读取写入的数据!");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取文件数据: " + data.toString());
});
});

执行结果:

$ node file.js
准备写入文件
数据写入成功!
--------我是分割线-------------
读取写入的数据!
异步读取文件数据: 我是通 过fs.writeFile 写入文件的内容

四、大文件操作(流式操作)

这个只能处理内容量较少的文件,会读取全部内容,将内容加载到内存

fs.createReadStream(path[, options]) 返回ReadStream 对象。

fs.createWriteStream(path[, options]) 返回 WriteStream 对象。

var path = require('path');
var fs = require('fs');
// 源路径
var spath = path.join(__dirname, '../doc', 'css.md');
// 目标路径
var dpath = path.join('D:\\Users\\peiyuli\\Desktop', 'css.md'); var readStream = fs.createReadStream(spath);
var writeStream = fs.createWriteStream(dpath); var sum = 0;
// 基于事件的处理方式 以chunk(块)为单位,每次读取文件大小时会触发data事件
readStream.on('data', function(chunk){
sum++;
writeStream.write(chunk);
});
// 数据处理完成标志 end事件
readStream.on('end', function(){
console.log('文件处理完成', sum);
});

方法二、简化流程

var path = require('path');
var fs = require('fs');
// 源路径
var spath = path.join(__dirname, '../doc', 'css.md');
// 目标路径
var dpath = path.join('D:\\Users\\peiyuli\\Desktop', 'css.md');
// 管道方法 将读取流和写入流融合到一块
fs.createReadStream(spath).pipe(fs.createWriteStream(dpath));

五、目录的操作

fs.mkdir(path[, options], callback) 创建目录

fs.mkdir(path.join(__dirname, 'abc'), function(err){
console.log(err);
});

执行结果:生成了abc目录

fs.readdir(path[, options], callback) 读取目录

var path = require('path');
var fs = require('fs');
fs.readdir(__dirname, function(err, files){
console.log(files);
files.forEach(function(item, index){
// 获取文件信息
fs.stat(path.join(__dirname, item), function(err, stat){
// 判断是否为文件
if(stat.isFile()){
console.log(item, '文件');
} else if(stat.isDirectory()){ // 判断是否为目录
console.log(item, '目录');
}
});
});
});

执行结果:

fs.rmdir(path[, options], callback) 删除目录

fs.rmdir(path.join(__dirname, 'abc'), function(err){
console.log(err);
});

Node.js核心模块API之文件操作的更多相关文章

  1. Node.js核心模块-fs文件系统

    fs是file-system的简写,文件系统的意思.在Node中如果想要进行文件操作,就必须引入fs这个核心模块. 引入 const fs = require('fs') fs.readFile(pa ...

  2. node.js核心模块

    全局对象 global 是全局变量的宿主 全局变量 在最外层定义的 全局对象的属性 隐士定义的变量(未定义直接赋值的变量) 当定义一个全局变量时 这个变量同时也会成为全局对象的属性 反之亦然 注意: ...

  3. 10.Node.js核心模块

    1.全局对象2.常用工具3.事件机制4.文件系统访问5.HTTP服务与客户端 一.全局对象(Global Object), 与window对象一样 process ==> 全局变量, 描述当前N ...

  4. Node.js核心模块_全局变量、util学习

    全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...

  5. Node.js核心模块-http

    通过node中的http模块可以创建编写服务器 引入 const http = require('http') http举例使用: const http = require('http') //引入 ...

  6. Node.js核心模块-net

    net.Socket 类 socket.remotePort 访问服务器的远程端口 const http = require('http'); const server = http.createSe ...

  7. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

  8. 36.Node.js 工具模块--OS模块系统操作

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模 ...

  9. 37.Node.js工具模块---处理和转换文件路径的工具 Path模块

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方 ...

随机推荐

  1. Android Studio 之 在活动中使用 Toast

    •简介 Toast 是 Android 系统提供的一种非常好的提醒方式: 在程序中可以使用它将一些短小的信息通知给用户: 这些信息会在一段时间内自动消失,并且不会占用任何屏幕空间 •Toast.mak ...

  2. 前端使用bcrypt对密码加密,服务器对密码进行校验

    以前为了防止前端密码安全问题,都是对密码进行md5(password + salt). 有些也会用别的加密方式,但还是会存在撞库,彩虹表等破解常规密码. 因此使用bcrypt加密是一个不错的选择,因为 ...

  3. Java单例模式实现,一次性学完整,面试加分项

    单例模式是设计模式中使用最为普遍的一种模式.属于对象创建模式,它可以确保系统中一个类只产生一个实例.这样的行为能带来两大好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而 ...

  4. Simulink中Scope数据保存至Workspace制图

    0 问题 通常情况下,仿真模型中scope波形可编辑程度并不高,尽管高版本MATLAB中已经可以将其直接导出到figure,但效果并不是特别理想.在需要高质量输出波形图场合,就需要将其中数据导出到wo ...

  5. Dynamics CRM安装教程五:ADFS安装配置

    ADFS即联合身份认证是一种更加安全的身份验证方式下面开始进行ADFS打开服务器管理器,到添加角色和功能向导下一步到下面界面勾选Active Directory 联合身份认证服务,下一步 默认,下一步 ...

  6. JDBC_08_解决SQL注入问题 (登录和注册)

    解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...

  7. Web安全实践

    目录 前言 编码安全 反序列化命令执行 SQL 注入 跨站 XSS(Cross-site scripting) 跨站请求伪造 CSRF(Cross-site request forgery) URL跳 ...

  8. SpringIOE-以xml方式实现

    SpringIOC框架简单实现 简单介绍 依赖注入( Dependency Injection ,简称 DI) 与控制反转 (IoC) 的含义相同,只不过这两个称呼是从两个角度描述的同一个概念,具体如 ...

  9. 【ElasticSearch】shards,replica,index之间的关系

    1.index 包含多个shard ,在创建index的时候可以自定义shards和replica的数量 例如: 新增一个index,手动指定shard和replica的数量 PUT demo_ind ...

  10. hdu4861 找规律了

    题意:      给你k个球和一个整数p,每个球的价值是 1^i+2^i+...+(p-1)^i (mod p),两个人轮流取球,最后谁的总价值也大谁就赢,问你先手能不能赢. 思路:      一开始 ...