我努力找了找图,不过清晰度堪忧啊,所以自己做了一张,有点丑不过也就这样了,哈哈。

今天的内容主要就是 Node.js 的文件系统,毕竟服务器么,也有文件服务器不是?


1 文件系统模块

这里把文件系统模块放在前面来说,因为上次的 HTTP 模块相对简单,所以放在了最后,但是有关文件操作的模块通常都比较复杂,为了确保没接触过的朋友也能看明白,这次就把它放前面来了。

fs 模块提供了许多非常实用的函数来访问文件系统并与文件系统进行交互,它作为 Node.js 核心的组成部分,无需安装,可以通过简单地引用来使用它:

const 

一旦这样做,就可以访问其所有的方法,包括:

  • fs.access():检查文件是否存在,以及 Node.js 是否有权限访问
  • fs.appendFile():追加数据到文件,如果文件不存在,则创建文件
  • fs.chmod(): 更改文件(通过传入的文件名指定)的权限,相关方法:fs.lchmod()fs.fchmod()
  • fs.chown():更改文件(通过传入的文件名指定)的所有者和群组,相关方法:fs.fchown()fs.lchown()
  • fs.close():关闭文件描述符
  • fs.copyFile():拷贝文件
  • fs.createReadStream():创建可读的文件流
  • fs.createWriteStream():创建可写的文件流
  • fs.link():新建指向文件的硬链接
  • fs.mkdir():新建文件夹
  • fs.mkdtemp():创建临时目录
  • fs.open():设置文件模式
  • fs.readdir():读取目录的内容
  • fs.readFile():读取文件的内容,相关方法:fs.read()
  • fs.readlink():读取符号链接的值
  • fs.realpath():将相对的文件路径指针(...)解析为完整的路径
  • fs.rename():重命名文件或文件夹
  • fs.rmdir():删除文件夹
  • fs.stat():返回文件(通过传入的文件名指定)的状态,相关方法:fs.fstat()fs.lstat()
  • fs.symlink():新建文件的符号链接
  • fs.truncate():将传递的文件名标识的文件截断为指定的长度,相关方法:fs.ftruncate()
  • fs.unlink():删除文件或符号链接
  • fs.unwatchFile():停止监视文件上的更改
  • fs.utimes():更改文件(通过传入的文件名指定)的时间戳,相关方法:fs.futimes()
  • fs.watchFile():开始监视文件上的更改,相关方法:fs.watch()
  • fs.writeFile():将数据写入文件,相关方法:fs.write()

关于 fs 模块的特殊之处是,所有的方法默认情况下都是异步的,但是通过加上 Sync 后缀也可以同步地工作。
例如:

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

这在应用程序流程中会产生巨大的差异。

Node.js 10 后,fs 也包括了对 Promise API 的支持,可以参考 FS Promise API

例如,试验一下 fs.rename() 方法, 异步的 API 会与回调一起使用:

const 

同步的 API 则可以这样使用,并使用 try/catch 块来处理错误:

const 

此处的主要区别在于,在第二个示例中,脚本的执行会阻塞(!!很重要,有的时候反而是解决一些问题的思路),直到文件操作成功。

2 在 Node.js 中使用文件描述符

在与位于文件系统中的文件进行交互之前,需要先获取文件的描述符。

文件描述符是使用 fs 模块提供的 open() 方法打开文件后返回的:

const 

注意,将 r 作为 fs.open() 调用的第二个参数,意味着打开文件用于读取。

当然如果仅仅是把文件描述符单独打印出来,其实就是个没什么意义的字符,比如:

其他常用的标志有:

  • r+ 打开文件用于读写
  • w+ 打开文件用于读写,将流定位到文件的开头;如果文件不存在则创建文件
  • a 打开文件用于写入,将流定位到文件的末尾;如果文件不存在则创建文件
  • a+ 打开文件用于读写,将流定位到文件的末尾;如果文件不存在则创建文件

也可以使用 fs.openSync 方法打开文件,该方法会返回文件描述符(而不是在回调中提供):

const 

一旦获得文件描述符,就可以以任何方式执行所有需要它的操作,例如调用 fs.open() 以及许多与文件系统交互的其他操作。

3 文件属性

每个文件都带有一组详细信息,可以使用 Node.js 进行检查,具体地说,使用 fs 模块提供的 stat() 方法。

调用时传入文件的路径,一旦 Node.js 获得文件的详细信息,则会调用传入的回调函数,并带上两个参数:错误消息和文件属性:

const 

Node.js 也提供了同步的方法,该方法会阻塞线程,直到文件属性准备就绪为止:

const 

文件的信息包含在属性变量中,可以通过属性提取很多信息,包括:

  • 使用 stats.isFile()stats.isDirectory() 判断文件是否目录或文件
  • 使用 stats.isSymbolicLink() 判断文件是否符号链接
  • 使用 stats.size 获取文件的大小(以字节为单位)

还有其他一些高级的方法,但是在日常编程中会使用的大部分是这些:

const 

当然这里为了能够输出结果,我直接打印在了控制台,可以直接看到结果。

4 文件路径

系统中的每个文件都有路径。

LinuxmacOS 上,路径可能类似于:

/users/joe/file.txt

Windows 上则有所不同,具有类似以下的结构:

C:usersjoefile.txt

当在应用程序中使用路径时需要注意,因为必须考虑到这种差异;不过好在 PowerShell 的出现使得统一使用类 Unix 路径成为可能,不过这个特指相对路径,如果是绝对路径,那么 Windows 还是必须遵从 [盘符]:[路径] 的方式。

可以使用以下方式将此模块引入到文件中:

const 

现在可以开始使用其方法了。

4.1 从路径中获取信息

给定一个路径,可以使用以下方法从其中提取信息:

  • dirname:获取文件的父文件夹
  • basename:获取文件名部分
  • extname:获取文件的扩展名

例如:

可以通过为 basename 指定第二个参数来获取不带扩展名的文件名:

4.2 使用路径

可以使用 path.join() 连接路径的两个或多个片段:

因为我用的是 Windows 系统,所以 / 或自动转换为 ;如果是类 Unix 系统,就是正常的 /

可以使用 path.resolve() 获得相对路径的绝对路径计算:

同上例

在此示例中,Node.js 只是简单地将 /server.js 附加到当前工作目录,如果指定第二个文件夹参数,则 resolve 会使用第一个作为第二个的基础:

如果第一个参数以斜杠开头,则表示它是绝对路径:

path.normalize() 是另一个有用的函数,当包含诸如 ... 或双斜杠之类的相对说明符时,其会尝试计算实际的路径:

解析和规范化都不会检查路径是否存在。 其只是根据获得的信息来计算路径。

5 读取文件

Node.js 中读取文件最简单的方式是使用 fs.readFile() 方法,向其传入文件路径、编码、以及会带上文件数据(以及错误)进行调用的回调函数:

另外,也可以使用同步的版本 fs.readFileSync()

const 

fs.readFile()fs.readFileSync() 都会在返回数据之前将文件的全部内容读取到内存中。

这意味着大文件会对内存的消耗和程序执行的速度产生重大的影响。

在这种情况下,更好的选择是使用流来读取文件的内容。

6 写入文件

Node.js 中写入文件最简单的方式是使用 fs.writeFile() API

例如:

另外,也可以使用同步的版本 fs.writeFileSync()

const 

默认情况下,此 API 会替换文件的内容(如果文件已经存在)。

可以通过指定标志来修改默认的行为:

fs

可能会使用的标志有:

  • r+ 打开文件用于读写
  • w+ 打开文件用于读写,将流定位到文件的开头;如果文件不存在则创建文件
  • a 打开文件用于写入,将流定位到文件的末尾;如果文件不存在则创建文件
  • a+ 打开文件用于读写,将流定位到文件的末尾;如果文件不存在则创建文件

(可以在 http://nodejs.cn/api/fs.html#fs_file_system_flags 中查看更多标志)

6.1 追加到文件

将内容追加到文件末尾的便捷方法是 fs.appendFile()(及其对应的 fs.appendFileSync()):

6.2 使用流

所有这些方法都是在将全部内容写入文件之后才会将控制权返回给程序(在异步的版本中,这意味着执行回调)。

在这种情况下,更好的选择是使用流写入文件的内容。

7 处理文件夹

Node.jsfs 核心模块提供了许多便捷的方法用于处理文件夹。

7.1 检查文件夹是否存在

使用 fs.access() 检查文件夹是否存在以及 Node.js 是否具有访问权限。

7.2 创建新的文件夹

使用 fs.mkdir()fs.mkdirSync() 可以创建新的文件夹:

7.3 读取目录的内容

使用 fs.readdir()fs.readdirSync() 可以读取目录的内容。

这段代码会读取文件夹的内容(全部的文件和子文件夹),并返回它们的相对路径,因为同步方式比较简单,不需要太多代码,所以这个例子是同步的:

可以获取完整的路径:

当然在 Windows 上面又变成了这样,我忍

也可以过滤结果以仅返回文件(排除文件夹):

7.4 重命名文件夹

使用 fs.rename()fs.renameSync() 可以重命名文件或者文件夹,第一个参数是当前的路径,第二个参数是新的路径:

文件重命名
文件夹重命名

fs.renameSync() 是同步的版本:

const 

7.5 删除文件夹

使用 fs.rmdir()fs.rmdirSync() 可以删除文件夹。

删除包含内容的文件夹可能会更复杂,因为这个功能不能同时删除文件,所以必须先删除文件夹内的所有文件,才能实现删除文件夹的操作。

在这种情况下,最好安装 fs-extra 模块,该模块非常受欢迎且维护良好,它是 fs 模块的直接替代品,在其之上提供了更多的功能。

在此示例中,需要的是 remove() 方法。

首先使用以下命令安装该模块:

npm install -g fs-extra

并像这样使用它:

也可以与 promise 一起使用:

fs

或使用 async/await

async 

8 路径模块

因为前面用到了路径模块,所以也简单的介绍一下这个模块。

path 模块提供了许多非常实用的函数来访问文件系统并与文件系统进行交互,同样作为 Node.js 核心的组成部分,也是无需安装的,可以通过简单地引用来使用它:

const 

该模块提供了 path.sep(作为路径段分隔符,在 Windows 上是 ,在 Linux/macOS 上是 /)和 path.delimiter(作为路径定界符,在 Windows 上是 ;,在 Linux/macOS 上是 :)。

还有一下这些 path 方法:

8.1 path.basename()

返回路径的最后一部分。 第二个参数可以过滤掉文件的扩展名:

8.2 path.dirname()

返回路径的目录部分:

8.3 path.extname()

返回路径的扩展名部分:

8.4 path.isAbsolute()

如果是绝对路径,则返回 true

8.5 path.join()

连接路径的两个或多个部分:

8.6 path.normalize()

当包含类似 ... 或双斜杠等相对的说明符时,则尝试计算实际的路径:

8.7 path.parse()

解析对象的路径为组成其的片段:

  • root:根路径
  • dir:从根路径开始的文件夹路径
  • base:文件名 + 扩展名
  • name:文件名
  • ext:文件扩展名

例如:

require

结果是:

8.8 path.relative()

接受 2 个路径作为参数;基于当前工作目录,返回从第一个路径到第二个路径的相对路径。

例如:

8.9 path.resolve()

可以使用 path.resolve() 获得相对路径的绝对路径计算:

通过指定第二个参数,resolve 会使用第一个参数作为第二个参数的基准:

如果第一个参数以斜杠开头,则表示它是绝对路径:

当然 Windows 是无法省略掉盘符的,所以……不像类 Unix 系统是直接到了根路径。

cp无法获取文件状态stat_Node.js从零开始——文件系统相关推荐

  1. stat()函数:获取文件状态

    相关函数:fstat, lstat, chmod, chown, readlink, utime 头文件:#include<sys/stat.h>  #include<uninstd ...

  2. Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)

    1. 概述 os 包提供了操作系统函数的不依赖平台的接口.失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.例如,如果某个使用一个文件名的调用(如Open.Stat)失败了,打印错误时会包含 ...

  3. python 文件状态_Python:如何访问文件的状态

    一.案例:在某些项目中,需要获取文件的状态 文件状态:os.stat(path) 1.文件的类型:普通文件.目录.符号链接.设备文件或管道(一般在Linux上)... 2.文件的访问权限:一般为读.写 ...

  4. c++ 读文件 文件指针 继续读_FatFs文件系统使用笔记

    关于FatFs文件系统的指引 关于FATFS的使用记录一.提前说明二.各文件说明三.使用说明       3.1 diskio.c函数的编写       3.2 f_open读写性质说明        ...

  5. mime类型是什么 node_Node.js - 文件系统获取文件类型

    我需要借助node.js来获取文件的文件类型以设置内容类型.我知道我可以很容易地检查文件扩展名,但我也有没有扩展名的文件,其内容类型应该是image/png,text/html aso.Node.js ...

  6. js正则表达式获取后缀名_jquery如何获取文件后缀

    jquery获取文件后缀的方法:1.使用正则表达式"(/[.]/.exec(filename)) ? /[^.]+$/.exec(filename.toLowerCase()):'';&qu ...

  7. 解决浏览器加载缓存js文件不能及时获取服务器更新后js文件问题

    当服务器修改js文件后,需要用户重新获取修改后的js文件,而不是访问之前浏览器中缓存的js文件.下面记录一个现在最常用的方法: 页面中访问js的链接如下: <script src="/ ...

  8. js获取文件MD5值

    要在web页面中计算文件的md5值,还好这个项目是只需兼容现代浏览器的,不然要坑死了. 其实对文件进行md5,对于后端来说是及其简单的.比如使用Node.js,只要下面几行代码就可以了: var fs ...

  9. 用JavaScript获取网页中的js、css、Flash等文件

    目录 一.前言 二.从E书或网页中获取文件的一般步骤 三.从E书或网页中获取链接进来的css文件 四.从E书或网页中获取链接进来的js文件 五.从E书或网页中获取Flash文件 六.从E书或网页中获取 ...

最新文章

  1. Docker(十三):Docker 清理命令集锦
  2. python培训骗局-python 无良培训忽悠骗局知多少?
  3. python和c++哪个好用-python和C++语言哪个好?老男孩教育
  4. XML 解析错误:XML 或文本声明不在实体的开头位置,有效的解决方法
  5. SAP C4C - Field creation not permitted in partner devel
  6. 评估报告有效期过期了怎么办_托福成绩过期了怎么办?
  7. ajax同步和异步的区别_同步电机和异步电机区别
  8. 阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破
  9. 编程调节Win7/Win8系统音量的一种方法
  10. java解析json的一种方法
  11. 【ICLR2020】通过强化学习和稀疏奖励进行模仿学习
  12. jdk及tomcat的安装
  13. php libxml安装,关于linux 安装libxml2
  14. unity xlua 在vs2019下断点调试(babelua)
  15. 微商分销代理商城源码带代理等级和升级条件 thinkphp框架
  16. 关于“商用超极本应用体验分享沙龙”的体验之旅——商用超极本的崛起之路、真机实测、优缺点分析与使用评价
  17. 《C++沉思录》学习笔记1
  18. 什么是蓝牙(Bluetooth)
  19. 【Neo4j × 知识图谱】图形化数据库基本操作: 创建节点与关系、添加属性、查询节点 | 附:可视化 构建四大名著 知识图谱(含源代码)| word2vec实战: 构造斗罗大陆人物关系
  20. 【Dos】常见的Dos攻击

热门文章

  1. SpringBoot异常处理ErrorController详解
  2. hbase 完全分布式启动集群报错: KeeperErrorCode = NoNode for /hbase/master 问题
  3. 解决HBase RegionServer进程还在,但是显示已经dead了
  4. linux bash中的引号:单双引号、反撇号
  5. 非公平锁和公平锁在reetrantlock里的实现过程是怎样的
  6. 垃圾回收器的基本原理是什么?
  7. python二级多少分过_python二级操作题与分析(2)
  8. prometheus和grafana、node_exporter监控服务资源
  9. 使用javadoc命令生成文档
  10. Qt QWidget实现手势缩放和平移(一)