第 6 课:文件系统
1. 阅读 Node.js API 资料
2. 回调异步方式打印文件内容
要求:
- 创建 10-file-system 目录
- 编写 01-my-cat-async.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
- 文件不存在则打印错误信息
- 文件存在则在控制台打印文件内容
- 用回调异步方式读取文件内容
3. Promise 异步方式打印文件内容
要求:
- 创建 10-file-system 目录
- 编写 02-my-cat-promise.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 文件不存在则打印错误信息
- 文件存在则在控制台打印文件内容
- 用 Promise 异步方式读取文件内容
4. 底层 API 打印文件内容
要求:
- 编写 03-my-cat-lower.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
- 文件不存在则打印错误信息
- 文件存在则在控制台打印文件内容
- 用底层 API 打开文件,再同步读取文件内容
5. 混合方式打印文件内容
要求:
- 编写 04-my-cat-mix.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
- 文件不存在则打印错误信息
- 文件存在则在控制台打印文件内容
- 用底层 API 打开文件,再同步读取文件内容
- 用 writeSync 向控制台输出文件内容
6. 流方式打印文件内容
要求:
- 编写 05-my-cat-stream.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
- 文件不存在则打印错误信息
- 命令行参数是目录名称时打印相应的错误信息
- 文件存在则在控制台打印文件内容
- 用流的方式读取文件内容并将管道接入到标准输出流上
7. 同步方式打印文件内容
要求:
- 编写 06-my-cat-sync.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
- 文件不存在则打印错误信息
- 文件存在则在控制台打印文件内容
- 用同步的方式读取文件内容并将文件内容输出到控制台上
8. 复制文件
要求:
- 编写 07-my-cp.js 脚本
- 要求支持命令行参数,包括:要复制的源文件名和目标文件名
- 源文件不存在则打印错误信息
- 除了能复制文件内容,还需要复制文件权限
- 用 fs 模块的底层 API 实现 07-my-cp-low.js
- 用 fs 模块的同步 API 实现 07-my-cp-sync.js
- 用 fs 模块的异步 API 实现 07-my-cp-async.js
- 用 fs 模块的底层和高级 API 实现 07-my-cp-mix.js
- 用 fs 模块的流 API 实现 07-my-cp-stream.js
9. 移动文件
要求:
- 编写 08-my-mv.js 脚本
- 要求支持命令行参数,包括:要移动的源文件名和目标文件名
- 源文件不存在则打印错误信息
- 除了能移动文件,可以修改文件名
10. 删除文件
要求:
- 编写 09-my-rm.js 脚本
- 要求支持命令行参数,包括:要删除的文件名
- 文件不存在打印错误信息
- 文件存在则删除
- 如果命令行参数指定的是一个目录,则忽略他
11. 创建空文件
要求:
- 编写 10-my-touch.js 脚本
- 要求支持命令行参数,包括:要创建的文件名
- 命令行参数不存在打印错误信息
- 创建指定名称的文件
- 文件的长度为 0 字节
12. 查看目录内容
要求:
- 编写 11-my-ls.js 脚本
- 要求支持命令行参数,包括:要查看的目录名
- 命令行参数不存在的情况下,默认查看当前脚本所在目录
- 命令行参数指定的目录不存在的情况下,打印错误信息
- 在控制台打印指定目录下的内容
13. 创建目录
要求:
- 编写 12-my-mkdir.js 脚本
- 要求支持命令行参数,包括:要创建的目录名
- 命令行参数不存在的情况下,打印错误信息
- 在当前目录创建指定名称的文件夹
14. 删除目录
要求:
- 编写 13-my-rm-dir.js 脚本
- 要求支持命令行参数,包括:要删除的目录名
- 命令行参数不存在的情况下,打印错误信息
- 删除指定名称的文件夹
- 如果命令行参数是一个文件名,则忽略他
15. 创建链接
要求:
- 编写 14-my-ln.js 脚本
- 要求支持命令行参数,包括:源文件和链接文件或者 -s 选项
- -s 选项说明创建的是符号链接
- 没有 -s 选项说明创建的是硬链接
- 命令行参数不正确时,提示相应的错误信息
- 可以创建硬链接也可以创建符号链接
16. 打印链接
要求:
- 编写 15-read-lnk.js 脚本
- 要求支持命令行参数,包括:链接文件名
- 命令行参数不存在的情况下,打印错误信息
- 命令行参数指定的文件名不存在时,打印错误信息
- 正常情况下打印符号链接所链接的文件
17. 修改文件权限
要求:
- 编写 16-my-chmod.js 脚本
- 要求支持命令行参数,包括:权限模式和文件名
- 命令行参数不存在的情况下,打印错误信息
- 命令行参数指定的文件名不存在时或者其他参数不正确时,打印相应的错误信息
- 正常情况下修改指定文件的权限
18. 修改文件所有者
要求:
- 编写 17-my-chown.js 脚本
- 要求支持命令行参数,包括:用户 ID,组 ID 和文件名
- 命令行参数不存在的情况下,打印错误信息
- 命令行参数指定的文件名不存在时或者其他参数不正确时,打印相应的错误信息
- 正常情况下修改指定文件的所属用户和所属组
19. 文件信息统计
要求:
- 编写 18-my-stat.js 脚本
- 要求支持命令行参数,包括:要统计信息的文件名
- 命令行参数不存在的情况下,默认统计当前脚本文件的信息
- 命令行参数指定的文件名不存在时,打印错误信息
- 正常情况下统计命令行参数指定文件的统计信息
20. 监视文件变化
要求:
- 编写 19-watch.js 脚本
- 要求支持命令行参数,该参数是要监视的目录名
- 如果参数不存在,默认监视当前脚本所在的目录
- 如果参数存在,但是目录不存在,提示错误信息
- 监视脚本所在目录下文件的变化
- 把目录下文件的变化输出到控制台
- 按下 Ctrl+C 或者 kill -2 pid,程序结束运行
- 程序结束前打印程序将要结束运行的提示信息
- 程序并不立即结束,需要等 5 秒后才结束
21. 递归删除
要求:
- 编写 20-my-rm.js 脚本
- 要求支持命令行参数,包括:要删除的目录名或文件名
- 命令行参数不存在的情况下,打印错误信息
- 命令行参数指定的文件名或者目录名不存在时,打印错误信息
- 如果命令行参数是合法的文件名,则删除文件
- 如果命令行参数是合法的目录名,则删除该目录以及该目录下的所有文件以及子目录
22. 生成不可压缩的文件
要求:
- 编写 21-bin.js 脚本
- 该程序在当前目录创建
test.bin
文件 - 该文件有 256 个字节
- 第一个字节是 0,最后一个字节是 255
- 每个字节比前一个字节的值递增一
- 运行该程序
xxd test.bin
,查看每个字节的值- 用压缩软件压缩
test.bin
,看看压缩文件的大小 - 思考该文件不可压缩的原因
23. 打印文件加行号
要求:
- 编写 22-readline.js 脚本
- 该程序运行效果类似
cat -n filename
- 该程序逐行打印文件内容,并且在每行前面加上行号信息
- 用 readline 模块实现逐行打印功能
24. 打印 CPU 信息
要求:
- 编写 23-cpu-info.js 脚本
- 该程序打印当前操作系统的 CPU 信息
- CPU 信息类似下面
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 154
model name : 12th Gen Intel(R) Core(TM) i5-1240P
stepping : 3
microcode : 0xffffffff
cpu MHz : 2112.008
下面省略 ......
- 思路:
cat /proc/cpuinfo
25. 打印操作系统的进程信息
要求:
- 编写 24-ps.js 脚本
- 该程序运行的效果类似
ps aux
- 该程序能够打印当前操作系统的进程信息
- 思路:
cat /proc/1/stat; cat /proc/1/cmdline
- stat 文件中空格隔开的各个字段的含义,请自行查阅资料
26. 读配置文件
要求:
- 编写 25-read-cfg.js 脚本
- 读取 nodejs-demo 仓库的 package.json 配置文件
- 在控制台打印 name, version, 和 description 三个信息
- 参考的输出格式如下:
name: nodejs-demo
version: 1.0.0
description: Node.js demo code
27. 写日志文件
要求:
- 编写 26-web-log.js 脚本
- 该程序创建 web 服务,监听 8080 端口
- 收到 HTTP 请求后,向客户端发送
hello
- 记录客户端请求的日志
- 日志文件名格式:
YYYY-MM-DD.log
- 日志文件名为记录日志的当前日期
- 即,每天的 HTTP 请求,会记录单独的日志文件
- 日志文件存放在家目录的
logs
文件夹下面 - 每次请求日志中记录的内容包括两行
- 第一行,
YYYY/MM/DD hh:mm:ss\t请求方法\t请求 URL\tHTTP 协议版本
- 第二行,
YYYY/MM/DD hh:mm:ss\t请求头信息
- 每次请求的日志信息要追加在日志文件的末尾
- 用浏览器或 curl 访问 web 服务,查看日志文件是否记录了本次请求
28. 表格打印 passwd
要求:
- 编写 27-passwd.js 脚本
- 以表格的方式打印
/etc/passwd
文件 passwd
文件每行的各个字段由:
分割- 每行所包含的字段,从左到右按顺序分别是
- 用户名(username):用于标识用户的唯一名称。
- 密码(password):存储用户密码的加密或哈希值。在某些系统中,由于安全原因,通常该字段会被替换为
x
或*
,实际密码会存储在 /etc/shadow 文件中。 - 用户ID(user ID):整数值,用于标识用户的唯一ID。一般用户的 UID 范围是1000 到 65534。
- 组ID(group ID):整数值,用于标识用户所属的主要组的ID。
- 用户信息(user info):任意文字字段,用于描述用户的详细信息,例如用户的全名、联系方式等。
- 家目录(home directory):用于存储用户个人文件的目录路径。
- 登录shell(login shell):用于指定用户登录系统时使用的 shell 程序。
- 打印的表格中,忽略密码字段和用户信息字段
- 打印效果参考如下:
┌─────────┬────────────────────┬───────────┬───────────┬────────────────────────────┬─────────────────────┐
│ (index) │ user_name │ user_id │ group_id │ home_dir │ login_shell │
├─────────┼────────────────────┼───────────┼───────────┼────────────────────────────┼─────────────────────┤
│ 0 │ 'root' │ '0' │ '0' │ '/root' │ '/bin/bash' │
│ 1 │ 'daemon' │ '1' │ '1' │ '/usr/sbin' │ '/usr/sbin/nologin' │
│ 2 │ 'bin' │ '2' │ '2' │ '/bin' │ '/usr/sbin/nologin' │
│ 3 │ 'sys' │ '3' │ '3' │ '/dev' │ '/usr/sbin/nologin' │
│ 4 │ 'sync' │ '4' │ '65534' │ '/bin' │ '/bin/sync' │
│ 5 │ 'games' │ '5' │ '60' │ '/usr/games' │ '/usr/sbin/nologin' │
└─────────┴────────────────────┴───────────┴───────────┴────────────────────────────┴─────────────────────┘