nodejs的文件系统fs模块,可以实现对文件、目录等的操作,stream模块实现对文件数据的断续读写操作

一、文件操作

fs.readFile(file[,options],callback)  异步读取数据,参数err,data

fs.readFileSync(file[,options])  同步读取数据,返回读取的数据

fs.writeFile(file, data[,options],callback)  异步写数据,参数err

fs.writeFileSync(file,data[,options])  同步写数据,返回undefined

fs.stat(path,callback)  返回一个stats对象到回调函数参数中, 通过该stats对象获取文件信息,参数err,stats

fs.statSync(path)  同步,返回一个stats对象

------------------------------------------------------------------

stats对象获取信息方法:

stats.isFile()   是否为文件
stats.isDirectory()   是否为目录(文件夹)
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

-------------------------------------------------------------

在index.js同级目录下创建一个file.txt, 里面填写数据作为测试用,比如Hello World

1、fs.readFile

"use srict";

const fs = require('fs');

fs.readFile('./file.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
return;
}
console.log(data);
});

2、fs.readFileSync

"use srict";

const fs = require('fs');

const data = fs.readFileSync('./file.txt', 'utf-8');
console.log(data);

3、fs.writeFile

读取file.txt文件数据,然后写到data.txt文件中,如果data.txt不存在,会自动创建然后写入,如果存在会先删除data.txt中数据,然后写入覆盖。

"use srict";

const fs = require('fs');

fs.readFile('./file.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
return;
}
fs.writeFile('./data.txt', data + ' from file.txt', 'utf-8', function (err) {
if (err) {
console.log(err);
return;
}
console.log('write success');
})
});

4、fs.stat

"use srict";

const fs = require('fs');

fs.stat('./file.txt', (err, stats) => {
if (err) {
console.log(err);
return;
}else {
if (stats.isFile()) {
fs.readFile(fileName, 'utf-8', (err, data) => {
if (err) {
console.log(err);
return;
}
fs.writeFile('./swFile.txt', data + 'from file.txt by stat', 'utf-8', (err) => {
if (err) {
console.log(err);
return;
}
console.log('write success stat');
})
});
} else {
console.log('The file is dirtory');
}
}
});

二、文件夹操作

fs.mkdir(path[,mode],callback)  创建文件夹,参数mode指的是文件夹权限,参数err

fs.mkdirSync(path[,mode])  同步创建文件夹,返回undefined

fs.readdir(path[,options],callback)  读取文件夹,返回一个数组到回调参数,包含该文件夹所有子内容的名字string,不包括子孙内容,参数err, dir

fs.readdirSync(path[,options])  同步读取文件夹,返回读取的文件夹数组数据

"use srict";

const fs = require('fs');

fs.readdir('./fsDemo', function (err, dir) {
if (err) {
console.log(err);
return;
}
console.log(dir); // ['demo01', 'demo02']
});

遍历文件夹中所有子孙,然后打印出其名字:

"use strict";
// 遍历目录中所有文件
const fs = require('fs'); bfs('./dir'); function bfs(dirPath) {
const state = fs.statSync(dirPath);
if (state.isFile()) {
console.log(dirPath);
return;
}
if (!state.isDirectory()) {
return;
}
fs.readdir(dirPath, function (err, dirs) {
if (err) {
console.log(err);
return;
}
dirs.forEach((dir, index, arr) => {
bfs(dirPath + '/' + dir);
});
});
}

四、流操作(stream模块)

fs.createReadStream(path[,options])  创建一个读流操作对象,返回一个readable对象

-------------------------------------------------------

readable对象支持的事件:

data:当有数据读取的时候,返回读取的数据到回调函数参数中

readable:当有数据可读取的时候触发,但不会读取数据,仅仅做判断用

end:当数据全部读取完毕的时候触发

readable对象支持的方法:

rs.pause()  暂停读取数据

rs.resume()  打开读取流,恢复读取数据

rs.read()  读取当前剩余数据并返回,没有则返回null

options 是一个对象或者字符串,各个默认值为

{
  flags: 'r',
  encoding: null,
  fd: null,
  mode: 0o666,
  autoClose: true
}

---------------------------------------------------

fs.createWriteStream(path[,options])  写流操作,返回一个writable对象

---------------------------------------------------

writable支持的事件:

finish:当end方法被调用,且所有数据都写入完毕时触发

pipe:当对象通过pipe写入数据时

writable对象支持的方法:

ws.write(chunk[,encoding][,callback])  写数据,chunk是要写入的数据(string|buffer) callback:写入后回调函数

ws.end()  关闭写入流

----------------------------------------------------

pipe方法:

rs.pipe(ws) 从左向右看,创建一个管道,将rs读取的数据通过管道流入到ws写入

-----------------------------------------------------------------------------------------------------------

fs.createReadStream

"use srict";

const fs = require('fs');

const rs = fs.createReadStream('./file.txt', 'utf-8');
// 当读取数据时触发,将读取的数据打印
rs.on('data', function (data) {
console.log(data);
});
// 当有数据可读是,将剩余数据全部打印出来
rs.on('readable', function() {
console.log(rs.read())
});
// 当读取结束时,打印read finished
rs.on('end', function () {
console.log('read finished');
});

fs.createWriteStream

"use strict";

const fs = require('fs');

const rs = fs.createReadStream('./file.txt', 'utf-8');
const ws = fs.createWriteStream('./data.txt', {
flags: 'w', // a 追加,w 删除后再写,默认为w });
// 当读取数据时触发,将读取的数据写入
rs.on('data', function (data) {
ws.write(data);
});
// 当读取数据结束时,关闭写入流,打印write end
rs.on('end', function (data) {
ws.end();
console.log('write end');
}); // 其实可以通过pipe方法,一句代码实现上边的功能,如下
// rs.pipe(ws);

五、文件检测:

fs.watch(filename[,options][,listener])  监听文件是否改变

------------------------------------------------------------------------------------------

options = {
persistent: 是否持续的检测文件,默认为true,
recursive: 如果检测的是一个目录,是否检测整个目录,默认为false,
encoding: 编码,默认utf-8
}

listener监听函数有两个参数, eventType和filename,
eventType是事件类型'rename' / 'change',
filename是监听的文件名字

rename发生后,无法继续检测

--------------------------------------------------------------------------------------------

使用postcss和autoprefixer这两个插件来检测css文件,如果我们更改了该css内容,则自动读取该css文件内容,然后经过这两个插件处理为响应属性自动添加前缀,然后写入到dest.css 目标文件中,省去了我们增加前缀的时间。

首先我们建立postcss文件,然后建立一个index.css文件和index.js文件,最后在该目录下执行npm init创建一个包,然后执行npm install postcss autoprefixer --save安装这两个插件。

我们在index.js文件中添加如下代码:

"use strict";
// npm init
// cnpm install postcss autoprefixer --save
const postcss = require('postcss');
const fs = require('fs');
const source = "./index.css";
const dest = './dest.css';
// 检测文件是否发生改变,如果发生改变,则读取文件,然后处理,最后写到dest.css目标文件上
fs.watch(source, function () {
fs.readFile(source, 'utf-8', function (err, css) {
postcss([require('autoprefixer')])
.process(css)
.then(function (result) {
// result.css
fs.writeFile(dest, result.css);
console.log('compile success');
});
});
}); console.log('start watch……');

执行node index.js,

然后在index.css代码中添加

div
{
transition: width 2s;
transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 2s;
}

最后我们可以看到,该目录下生成了一个dest.css文件,其中就是自动为index.css代码添加前缀后的代码,如下:

div
{
-webkit-transition: width 2s;
transition: width 2s;
-webkit-transition-property: width;
transition-property: width;
-webkit-transition-duration: 1s;
transition-duration: 1s;
-webkit-transition-timing-function: linear;
transition-timing-function: linear;
-webkit-transition-delay: 2s;
transition-delay: 2s;
}

-------------------------------------------------------------------------------------end

nodejs模块之fs&&stream的更多相关文章

  1. Nodejs模块:fs

    /** * @description fs模块常用api */ // fs所有的文件操作都是异步IO,如果要以同步的方式去调用,都会加一个在原同步api的基础上加Sync // 同步的方式会在最后传入 ...

  2. nodejs中的fs模块中的方法

    nodejs中的fs模块 引入模块 const fs =require("fs") 检测文件是否存在fs.stat(path,callback) fs.stat("./n ...

  3. nodejs学习笔记一( sublime、atom开发环境,http模块,fs模块的初识)

    http服务   let server = http.createServer(function(req,res){       });   监听: server.listen(8080);   re ...

  4. nodejs nodejs模块使用及简单的示例

    nodejs模块使用及简单的示例 参考菜鸟教程网:http://www.runoob.com/ 一.fs模块的使用: 1.文件操作: 读文件: //读文件 var fs=require('fs'); ...

  5. 使用NodeJS模块-NodeJS官方提供的核心模块

    除了使用自己写的本地模块以外,NodeJS可以使用另外两种类型的模块,分别是NodeJS官方提供的核心模块和第三方提供的模块 NodeJS官方提供的核心模块 NodeJS平台自带的一套基本的功能模块, ...

  6. Node.js学习——基本模块之fs

    基本模块之fs 异步读文件 异步读取一个文本文件的代码如下: 'use strict'; var fs = require('fs'); fs.readFile('sample.txt', 'utf- ...

  7. NodeJS 模块开发及发布详解

    NodeJS 是一门年轻的语言,扩展模块并不太全,经常我们想用某个模块但是却找不到合适的.比如前两天我需要使用hmac和sha1来做签名,就没有找到一个比较好用的模块,这时候就需要我们自己来实现相应的 ...

  8. nodejs模块——http模块

    http模块主要用于创建http server服务. 本文还用到url模块和path模块,还有fs模块.url模块用于解析url,path模块用于处理和转换文件路径. 一.简单应用 代码如下: // ...

  9. NodeJS模块、包、NPM

    1.NodeJS模块        每一个Nodejs都是一个NodeJS模块,包括JS文件,JSON文本文件,二进制模块文件. a.模块的应用               新建一个文件mytest. ...

随机推荐

  1. UINavigationController改变动画效果

    @interface UINavigationController (CustomTransition) - (void) pushWithCustomAnimation:(UIViewControl ...

  2. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  3. Python之内置类型

    python有6大内置类型 数字.序列.映射.类.实例.异常. 下面就慢慢来说明: 1.数字 有3个明确的数字类型,整型,浮点型及复数.另外,布尔是整型的一个子类型. (另外标准库还包含额外的数字类型 ...

  4. 【转】Lua 操作系统库

      转老帖子备份 转自:http://www.cnblogs.com/whiteyun/archive/2009/08/10/1542913.html os.clock () 功能:返回一个程序使用C ...

  5. An error occurred while searching for implementations of method

    1:在我安装完scala的插件后,在打开方法的实现类(open implementactions)的时候,抛出这个异常,后来发现这个异常是因为我的scala的插件跟我eclipse版本不兼容导致的. ...

  6. html及css

    html设置网页的结构内容,css设置样式,要记的标签很多,要学好无非是多练,然后看别人怎样写的代码,对比自己的,这样能更好地理解. 关于浮动,既然所有浮动必须要清除,那在设置浮动的同时,就先把清除浮 ...

  7. oracle中sqlldr工具使用时注意事项

    1.命令写在一行:如,sqlldr sh/&sh_pass@&connect_string control=&ctl_file data=&dat_file log=& ...

  8. Window10 安装问题汇总

       7月28号之后,由于没有收到windows的升级提醒,所以下载了ISO文件手动进行了升级.      本文就升级过程中遇到的问题进行一下总结:    1.ISO文件名称:cn_windows_1 ...

  9. excel表格系列

    MicroSoft Excel表格系列问题 1.excel表格修改默认行高 2.[Excel技巧]Excel实现部分保护技巧

  10. 【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter对SOAP协议性能测试脚本开发

    目录: 创建WebService接口模拟服务端 下载SoapUI 新建MathUtil.wsdl文件 创建一个SOAP项目 接口模拟服务端配置以及启动 JMeter对SOAP协议性能测试脚本开发 [阐 ...