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,所以具体实现如下:
上述代码实现了用递归思想运算 n!。由代码我们可以看出递归的几点要求:1. 能调用本身(常见的是函数);2. 调用自身,多层数据嵌套;3. 为了不陷入死循环,必需提供明确的结束出口。
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)
所有文件操作的方法都有同步和异步两种方法。
1、文件夹的操作(callback指的是回调函数)
1.1 文件夹的创建
异步方法:
当创建成功时(当前文件夹下面没有newdir01文件或文件夹),控制台打印:创建完成;
当创建失败时(当前文件夹下面存在newdir01文件或文件夹),控制台打印:文件夹创建失败:EEXIST: file already exists, mkdir 'C:\Users\qiuji\Desktop\myNode.js\fs\newdir01' (英文部分是: error.message)。
1.2 文件夹的删除(一定要保证文件夹是空的)
同步方法:同步方法使用try{ ... }catch(error){ ... } 捕获错误信息
当目标文件夹中存在文件或文件夹时,删除失败,返回错误信息:执行失败:ENOTEMPTY: directory not empty, rmdir 'C:\Users\qiuji\Desktop\myNode.js\fs\newdir01';(要删除的文件夹必需为空)
1.3 文件夹的修改
1.3.1 权限修改
1.3.2 文件夹名称的修改
异步方法:
上述代码的作用是把当前路径下的名为“newdir01”的文件夹改名为“文件夹”。修改文件名的实际操作是先复制再删除再创建的过程。所以,文件夹路径可以改变,如“../文件夹”,可以自己试一下。文件的改名方法和文件夹的改名方法完全相同,注意不要落下文件的扩展名。
1.4 文件夹的读取(读取深度为1,即只能读取一层文件夹)
如下图所示,是我当前newdir01文件夹的目录和读取结果:
2、文件的操作(同步方法和异步方法都能实现)
2.1 文件的创建和写入
异步方法:
2.2 文件的删除(取消硬连接)(具有权限)
2.3 文件的读取
运行代码后,除了创建了222.txt文件,控制台还输出以下结果:
fs.readFileSync( ) 方法也可以读取图片,将读取到的数据通过 fs.writeFileSync("图片名.扩展名",data),也可以实现图片的复制。
2.4 文件的追加(文本文件)
· file参数就是已经存在的文件路径
· 如果文件不存在,会自动创建一个新的文本文件
2.5 文件的修改
与文件夹的修改相同。
Node.js的 fs 文件系统暂时先说到这里,这里有三个小练习:
1. 打印出指定文件夹下的所有文件和文件夹(包括子文件夹中的所有文件和文件夹,依次层层进入,读取所有);
2. 打印出指定文件夹下的所以 “.txt” 文件夹;
3. 给定目录,创建文件夹。
我们在 2.3文件的读取 中提到 Buffer的概念。那么Buffer到底是什么呢?可以参考下一篇博客。
学完本篇博客后,你能不能实现我在上一篇博客结尾处提到的在http服务的响应中引入HTML文件呢?
这里有一种比较原始的方法:我这里的思路是触发事件后,在响应代码处,先读取指定的 .html 文件得到返回数据data,然后使用 response.write( data )响应写出数据。
可以实现 .html 文件的读取操作。但是,实际开发过程中不建议这种方法。
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 文件的读取操作。但是,实际开发过程中不建议这种方法。
相关文章推荐
- Node.js学习笔记4【核心模块--fs】
- node.js的fs核心模块读写文件操作 -----由浅入深
- 基于node.js的fs核心模块读写文件操作(实例讲解)
- Node.js---04、02. node.js 的核心模块之“Buffer ”
- Node.js核心模块
- Node.js:fs文件系统模块
- node.js零基础详细教程(2):模块化、fs文件操作模块、http创建服务模块
- 10.Node.js核心模块
- Node.js学习之内置模块fs
- Node入门四:node.js的部分核心模块
- Node.js核心模块http客户端
- Node.js fs模块——读写文件
- Node.js fs 模块
- NodeJs fs 模块
- 第1章-安装Node.js及相关要点-1.4.Node.js的核心模块
- Node.JS核心模块之全局对象和常用工具
- Node.Js中核心模块之文件系统解析
- Node.js 核心模块 笔记
- Node.js 手册查询-1-核心模块方法
- Node.js学习——基本模块之fs