第 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' │
└─────────┴────────────────────┴───────────┴───────────┴────────────────────────────┴─────────────────────┘

2018 -  by 王顶. All rights reserved.本站访客人数  人次

results matching ""

    No results matching ""