您的位置:首页 > Web前端 > Node.js

Node.js---04、01. node.js 的核心模块之“ fs ”

2017-11-09 00:00 603 查看
摘要: fs : 文件系统。node.js对文件以及文件夹的CRUD的相关操作,权限相关问题和递归算法的介绍。

fs : file system,文件系统。提供读取文件的方法,让代码取完成计算机的CRUD(增删改查)。
注意两个点:☛ 文件和文件夹对于程序而言都属于文件系统;
☛ 文件名包括自定义文件名.扩展文件名(后缀名)
在了解文件系统之前,我们先来了解两个概念:文件权限递归算法
☛ 权限



在控制台(这里是Mac系统)输出 “ls -l”,可以看到当前文件夹下面的文件权限。如:-rw-r--r--,drwxr-xr-x等。其中,r 表示read,可读,代表数字 4;w 表示write,可写,代表数字 2;x 表示execute,可执行,代表数字 1。所以,7=4+2+1表示可读可写可执行(好多地方会用数字表示权限)。
那么,为什么 r 代表数字4,w 代表数字2,x 代表数字 1 呢?
我们用“_(是否可读) _(是否可写) _(是否可执行)” 这顺序记好(读 写 执行),因为计算机中用二进制计数,所以这里拥有该权限用 1 表示,没有该权限用 0 表示。所以,用二进制 111 表示( rwx )可读可写可执行,二进制 111 转为 十进制(2^2+2^1+2^0=4+2+1)得 7。同理,只读权限(可读 不可写 不可执行)( r_ _ ),用二进制表示为 100,转为十进制(2^2)4 ;只写权限(不可读 可写 不可执行)( _w_ ),用二进制表示为 010,转为十进制(2^1)2 ;只操作权限(不可读 不可写 可执行)( _ _x ),用二进制表示为 001 ,转为二进制(2^0)1 等。相反,根据数字十进制 0-7 我们也可转为二进制 知道其具体权限。
既然我们已经知道权限对应字母和数字所代表的权限。那么我们来看一下这个“-rw-r--r--”,分四个部分看“-|rw-|r--|r--”:
第一部分:表示文件类型。常见类型 d 文件夹-普通文件 l (link) 链接;b 块设备文件;p 管道文件;c 字符设备文件;s 套接口文件。
第二部分:对当前用户权限;第三部分:对同组用户权限;最后部分:对其它用户权限。
所以,权限 777 表示对当前用户可读可写可执行,对同组用户可读可写可执行,对其它用户可读可写可执行。
☛ 递归(这里讲递归的原因是后面讲文件深度时会用到,能理解多少看个人)
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。
简单的认识一下递归:使用递归方式实现 n! (1*2*3*...*n)。因为 n! = (n-1)! * n,所以具体实现如下:
function doFun(n){//定义函数 n!
if(n==1) return 1;//函数的出口
return doFun(n-1)*n;//n!=(n-1)!*n,调用函数本身,参数改变。
}
let s = doFun(10);//作 10! 运算
console.log(s);

上述代码实现了用递归思想运算 n!。由代码我们可以看出递归的几点要求:1. 能调用本身(常见的是函数);2. 调用自身,多层数据嵌套;3. 为了不陷入死循环,必需提供明确的结束出口。

文件的操作

文件的操作分为文件夹的CRUD(增删改查)和文件的CRUD。
node.js 中,fs 文件系统模块提供读取文件的方法,让代码取完成计算机的CRUD(增删改查)。
☛ 文件夹的操作(callback指的是回调函数)
☛ 文件夹的创建
异步方法:fs.mkdir(path [,mode] ,callback)
同步方法:fs.mkdirSync(path [,mode])
☛ 文件夹的删除(一定要保证文件夹是空的)
异步方法:fs.rmdir(path , callback)
同步方法:fs.rmdirSync(path)
☛ 文件夹的修改
☛ 权限修改
权限问题不能实现官网上描述效果,这里就 不写了。
☛ 文件夹名称的修改
异步方法:fs.rename(oldPath , newPath , callback)
同步方法:fs.renameSync(oldPath , newPath)
☛ 文件夹的读取(读取深度为1,即只能读取一层文件夹)
异步方法:fs.readdir(path [, options] , callback)
同步方法:fs.readdirSync(path [, options])
☛ 文件的操作
☛文件的创建和写入
异步方法:fs.writeFile(path,data,callback)
同步方法:fs.writeFileSync(path,data)
☛ 文件的删除(取消硬连接)(具有权限)
异步方法:fs.unlink(path , callback)
同步方法:fs.unlinkSync(path)
☛ 文件的读取
异步方法:fs.readFile(path , callback)
同步方法:fs.readFileSync(path)
☛ 文件的追加(文本文件)
异步方法:fs.appendFile(file , data [, options] , callback)
同步方法:fs.appendFileSync(file , data [,options])
· file参数就是已经存在的文件路径
· 如果文件不存在,会自动创建一个新的文本文件
☛ 文件的修改
☛ 权限修改
☛ 文件名称的修改
异步方法:fs.rename(oldPath , newPath , callback)
同步方法:fs.renameSync(oldPath , newPath)

具体的代码实现:

以下代码中,所有回调函数中 error 返回 null 表示成功。
所有文件操作的方法都有同步和异步两种方法。
1、文件夹的操作(callback指的是回调函数)
1.1 文件夹的创建
异步方法:
// 在加载模块时
const fs = require("fs");

// 创建文件夹 mkdir
// 异步方法  ==>  callback 回调
// fs.mkdir(path [,mode] ,callback);
// path  路径/文件夹名称     支持绝对路径和相对路径
// callback(error)  执行完成后的回调函数,参数error 为错误消息
// mode (可省略)用于指定文件夹得权限,用777数字形式这种表示权限
//          因为系统的问题,权限相关可能无法达到API 中所描述的功能
fs.mkdir("./newdir01",(error)=>{// ./ 当前文件夹下,newdir01文件夹
if(error){
console.log("文件夹创建失败:"+error.message);//打印错误消息
return;
}
console.log("创建完成");
});

当创建成功时(当前文件夹下面没有newdir01文件或文件夹),控制台打印:创建完成;
当创建失败时(当前文件夹下面存在newdir01文件或文件夹),控制台打印:文件夹创建失败:EEXIST: file already exists, mkdir 'C:\Users\qiuji\Desktop\myNode.js\fs\newdir01' (英文部分是: error.message)。
1.2 文件夹的删除(一定要保证文件夹是空的)
同步方法:同步方法使用try{ ... }catch(error){ ... } 捕获错误信息
// 文件夹的删除
const fs = require("fs");

try {
fs.rmdirSync("./newdir01");
console.log("执行成功");
} catch (error) {
console.log("执行失败:"+error.message);
}

当目标文件夹中存在文件或文件夹时,删除失败,返回错误信息:执行失败:ENOTEMPTY: directory not empty, rmdir 'C:\Users\qiuji\Desktop\myNode.js\fs\newdir01';(要删除的文件夹必需为空)
1.3 文件夹的修改
1.3.1 权限修改
1.3.2 文件夹名称的修改
异步方法:
// 文件名修改,文件夹和文件方法完全相同
const fs = require("fs");

// 不是真正的更名
// 1、复制 2、删除 3、创建
fs.rename("./newdir01","./文件夹",(error)=>{
console.log(error);
});

上述代码的作用是把当前路径下的名为“newdir01”的文件夹改名为“文件夹”。修改文件名的实际操作是先复制再删除再创建的过程。所以,文件夹路径可以改变,如“../文件夹”,可以自己试一下。文件的改名方法和文件夹的改名方法完全相同,注意不要落下文件的扩展名。
1.4 文件夹的读取(读取深度为1,即只能读取一层文件夹)
const fs = require("fs");

fs.readdir("./newdir01",(err,files)=>{
if(err){
console.log("读取失败"+err.message);
return;
}
console.log(files);
});

如下图所示,是我当前newdir01文件夹的目录和读取结果:



2、文件的操作(同步方法和异步方法都能实现)
2.1 文件的创建和写入
异步方法:
// 文件的操作
const fs = require("fs");
// 文件的创建和写入 集成为一个方法
// 异步方法 fs.writeFile(path,data,callback)
//   文件不存在 创建;若存在,则删除再创建
//  path  路径/文件名
//  data  文件的数据
//  callback(error)  回调函数
fs.writeFile("./newdir01/a.txt","这是一个写入的字符串ssssss",(error)=>{
console.log(error);
});

2.2 文件的删除(取消硬连接)(具有权限)
// 文件的删除
const fs = require("fs");
try {
fs.unlinkSync("./文件夹/a.txt");
} catch (error) {
console.log(error.message);
}

2.3 文件的读取
// 文件的读取
const fs = require("fs");
try {
//读取指定文件内容(二进制文件的十六进制形式)
let data = fs.readFileSync("./newdir01/a.txt");
console.log(data);//buffer
console.log(data.toString());//转成字符串

//将newdir01/a.txt文件内容写入 222.txt
fs.writeFileSync("./222.txt",data);
} catch (error) {
console.log("文件读取失败"+error.message);
}

运行代码后,除了创建了222.txt文件,控制台还输出以下结果:



fs.readFileSync( ) 方法也可以读取图片,将读取到的数据通过 fs.writeFileSync("图片名.扩展名",data),也可以实现图片的复制。
2.4 文件的追加(文本文件)
// 文本文件的内容追加
const fs = require("fs");

fs.appendFile("./011.txt","追加新的字符串",(error)=>{
console.log(error);
});

· file参数就是已经存在的文件路径
· 如果文件不存在,会自动创建一个新的文本文件
2.5 文件的修改
与文件夹的修改相同。

Node.js的 fs 文件系统暂时先说到这里,这里有三个小练习:
1. 打印出指定文件夹下的所有文件和文件夹(包括子文件夹中的所有文件和文件夹,依次层层进入,读取所有);
2. 打印出指定文件夹下的所以 “.txt” 文件夹;
3. 给定目录,创建文件夹。
我们在 2.3文件的读取 中提到 Buffer的概念。那么Buffer到底是什么呢?可以参考下一篇博客。
学完本篇博客后,你能不能实现我在上一篇博客结尾处提到的在http服务的响应中引入HTML文件呢?
这里有一种比较原始的方法:我这里的思路是触发事件后,在响应代码处,先读取指定的 .html 文件得到返回数据data,然后使用 response.write( data )响应写出数据。
// 定义登录页面
emitter.on("/showLogin",function(req,res){
console.log("showLogin 页面");
try {
let data = fs.readFileSync("./01.html");
res.write(data)
} catch (error) {
console.log("文件读取失败"+error.message);
}
res.end();
});

可以实现 .html 文件的读取操作。但是,实际开发过程中不建议这种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息