# node-fs 文件系统
## 文件系统差异
> 不同文件系统行为表现有差异,大小写敏感差异,编码格式差异等。在日常使用 fs 文件系统的时候,我们要注意一些问题:
- 不要轻易比较两个文件的内容是否一致(不同文件系统都有自己的编码比较表)
- 不要损坏文件名和时间戳
- 时间戳解析各有不同
- mos:HFS+,linux:ext,windows:ntfs
> [测试一下](./test_time.js)
## fs 简介
- Node.js 中的 fs 模块是文件操作的封装,它提供了同步和异步两个版本,具有 sync 后缀的方法为同步方法,不具有的为异步方法,比如:readFile ,readFileSync
- 建议使用异步方法。相比于同步方法,异步方法不会阻塞进程,性能更快,速度也更快
> [测试一下](./test_sync.js)
## 文件权限
> 因为 fs 模块需要对文件进行操作,那就要懂得文件权限,一般文件权限有读、写、执行操作,不同的用户可能权限不懂
- 我们可以通过 git 交互界面输入 ls -al 来查看目录中文件和文件夹的权限
- 第一位代表是文件还是文件夹,d 开头代表文件夹,- 开头的代表文件,而后面九位就代表当前用户、用户所属组和其他用户的权限位,按每三位划分,
分别代表读(r)、写(w)和执行(x),- 代表没有当前位对应的权限
- windows 文件夹默认操作权限
1. 文件所有者
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | w | x |
| 数字表示 | 4 | 2 | 1 |
2. 文件所有组
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | - | x |
| 数字表示 | 4 | - | 1 |
3. 其他用户
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | - | x |
| 数字表示 | 4 | - | 1 |
- windows 文件默认操作权限
1. 文件所有者
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | w | - |
| 数字表示 | 4 | 2 | - |
2. 文件所有组
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | - | - |
| 数字表示 | 4 | - | - |
3. 其他用户
| 权限项 | 读 | 写 | 执行 |
| -------- | --- | --- | ---- |
| 字符表示 | r | - | - |
| 数字表示 | 4 | - | - |
## 标识符
> 因为文件权限的存在,node 也就有自己的标识符
1. 符号表
| 符号 | 标识 |
| ---- | ----------------------------------------------------------------------------- |
| a | 追加写入,文件不存在则创建文件 |
| ax | 与“a”类似,但如果路径存在,则会失败 |
| a+ | 打开文件进行读取和追加。如果文件不存在,则创建该文件 |
| ax+ | 与“a+”类似,但如果路径存在,则会失败 |
| as | 在同步模式下打开文件进行追加。如果文件不存在,则创建该文件 |
| as+ | 在同步模式下打开文件进行读取和追加。如果文件不存在,则创建该文件 |
| r | 打开文件进行读取。如果文件不存在,则会发生异常 |
| r+ | 打开文件进行读写。如果文件不存在,则会发生异常 |
| rs+ | 以同步模式打开文件进行读写。指示操作系统绕过本地文件系统缓存,不建议使用此标志 |
| w | 打开文件进行写入。创建文件(如果不存在)或截断文件(如果存在) |
| wx | 与“w”类似,但如果路径存在,则会失败 |
| w+ | 打开文件进行读写。创建文件(如果不存在)或截断文件(如果存在) |
| wx+ | 与“w+”类似,但如果路径存在,则会失败 |
## 常用命令
### 删除文件
fs.unlink(path, callback)
```javascript
let fs = require("fs");
fs.unlink("input.txt", function (err) {
if (err) {
return console.error(err);
}
console.log("文件删除成功!");
});
```
| 参数 | 描述 | 类型 | 默认值 |
| -------- | -------- | ----------------- | ----------------------------- |
| path | 文件路径 | string/Buffer/URL | - |
| callback | 回调函数 | function | 有一个参数 err,err 为错误信息 |
### 创建目录
fs.mkdir(path[, options], callback)
```javascript
let fs = require("fs");
fs.mkdir("/tmp/test/", function (err) {
if (err) {
return console.error(err);
}
console.log("目录创建成功。");
});
```
| 参数 | 描述 | 类型 | 默认值 |
| -------- | -------- | ----------------- | --------------------------------------------------------------------------------- |
| path | 文件路径 | string/Buffer/URL | - |
| options | 参数 | object/intege | recursive:是否以递归的方式创建目录,默认为 false,mode - 设置目录权限,默认为 0777 |
| callback | 回调函数 | function | 有一个参数 err,err 为错误信息 |
### 读取目录
fs.readdir(path, callback)
```javascript
let fs = require("fs");
fs.readdir("/tmp/", function (err, files) {
if (err) {
return console.error(err);
}
files.forEach(function (file) {
console.log(file);
});
});
```
| 参数 | 描述 | 类型 | 默认值 |
| -------- | -------- | ----------------- | ----------------------------- |
| path | 文件路径 | string/Buffer/URL | - |
| callback | 回调函数 | function | 有一个参数 err,err 为错误信息 |
### 删除目录
fs.rmdir(path, callback)
```javascript
let fs = require("fs");
fs.readdir("/tmp/", function (err, files) {
if (err) {
return console.error(err);
}
files.forEach(function (file) {
console.log(file);
});
});
```
| 参数 | 描述 | 类型 | 默认值 |
| -------- | -------- | ----------------- | ----------------------------- |
| path | 文件路径 | string/Buffer/URL | - |
| callback | 回调函数 | function | 有一个参数 err,err 为错误信息 |