Skip to content

Commit

Permalink
0828
Browse files Browse the repository at this point in the history
  • Loading branch information
lwstkhyl committed Aug 28, 2024
1 parent 5118031 commit 29ea3d8
Show file tree
Hide file tree
Showing 4 changed files with 205 additions and 0 deletions.
205 changes: 205 additions & 0 deletions 01.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
- [fs模块](#fs模块)
- [文件写入](#文件写入)
- [文件读取](#文件读取)
- [文件移动和重命名](#文件移动和重命名)
- [文件删除](#文件删除)
- [文件夹操作](#文件夹操作)
- [查看资源状态](#查看资源状态)
- [文件路径说明](#文件路径说明)

<!-- /code_chunk_output -->

Expand Down Expand Up @@ -356,3 +361,203 @@ rs.pipe(ws); //pipe:将rs的数据输入ws中
```

由于这里使用的文件大小仅为1MB左右,内存节省不明显。如果想要看到明显效果,至少要10MB数量级
##### 文件移动和重命名
`fs.rename(文件原路径, 文件新路径, callback)`异步/`fs.renameSync(文件原路径, 文件新路径)`同步
- 移动和重命名都是依靠修改文件路径实现
- 回调函数接收一个参数`err`

例:
```js
const fs = require('fs');
//重命名,即新旧路径只有文件的名称不同
fs.rename('./test.txt', './new_test.txt', err => {
if (err) {
console.log('重命名失败');
return;
}
console.log('重命名成功');
});
//移动,即新旧路径不同
setTimeout(() => { //重命名结束后再移动
fs.rename('./new_test.txt', './test/new_test.txt', err => {
if (err) {
console.log('移动失败');
return;
}
console.log('移动成功');
});
setTimeout(() => { //移动结束后再操作
//移动
fs.renameSync('./test/new_test.txt', './new_test.txt');
//重命名
fs.renameSync('./new_test.txt', './test.txt');
}, 0);
}, 0);
```
在上面的代码中,我们将`'./test.txt'`重命名为`'./new_test.txt'`,之后移动到`'./test'`文件夹中,最后又将这一过程复原
注:移动到的新文件夹必须是已存在的
##### 文件删除
- `fs.unlink(文件路径, callback)`异步/`fs.unlinkSync(文件路径)`同步
- `fs.rm(文件路径, callback)`异步/`fs.rmSync(文件路径)`同步

例:
```js
const fs = require('fs');
fs.rm('./test.txt', err => {
if (err) {
console.log('删除失败');
return;
}
console.log("删除成功");
});
fs.unlinkSync('./test1.txt');
```
##### 文件夹操作
- **创建**文件夹(异步/同步)`fs.mkdir(文件夹路径[, options], callback)`/`fs.mkdirSync(文件夹路径[, options])`
- 回调函数接收一个参数`err`
- **递归创建**(即创建一个a文件夹,在其中再创建一个b文件夹):设置option属性`recursive: true`
- **删除**文件夹(异步/同步)
- `fs.rmdir(文件夹路径[, options], callback)`/`fs.rmdirSync(文件夹路径[, options])`
- `fs.rm(文件夹路径[, options], callback)`/`fs.rmSync(文件夹路径[, options])`(建议使用)
- 回调函数接收一个参数`err`
- 需要文件夹为空才能删除
- **递归删除**(即文件夹内还有文件/文件夹):还是设置option属性`recursive: true`
- **读取**文件夹(异步/同步)`fs.readdir(文件夹路径[, options], callback)`/`fs.readdirSync(文件夹路径[, options])`
- 回调函数接收2个参数`err``data`,后者以数组形式列出文件夹中的内容(文件夹和文件的名称)
- 对于同步读取,它将读取结果直接返回

例:
- **创建**
```js
const fs = require('fs');
fs.mkdir('./html', err => {
if (err) {
console.log('创建失败');
return;
}
console.log('创建成功');
});
//递归创建
fs.mkdirSync('./a/b', { recursive: true });
```
- **读取**
```js
const fs = require('fs');
fs.readdir('./', (err, data) => {
if (err) {
console.log('读取失败');
return;
}
console.log('./', data);
});
console.log('../', fs.readdirSync('../'));
```
![文件夹操作1](./md-image/文件夹操作1.png){:width=200 height=200}
- **删除**
```js
const fs = require('fs');
fs.rmdirSync('./html');
//递归删除
fs.rmdir('./a', { recursive: true }, err => {
if (err) {
console.log('删除失败');
return;
}
console.log('删除成功');
});
//递归删除
fs.rm('./a', { recursive: true }, err => {
if (err) {
console.log('删除失败');
return;
}
console.log('删除成功');
});
```
##### 查看资源状态
`fs.stat(文件路径, callback)`/`fs.statSync(文件夹路径[, options])`
- 回调函数接收2个参数`err``data`,后者以类似于对象的形式列出文件信息
- 对于同步读取,它将读取结果直接返回

例:
```js
const fs = require('fs');
fs.stat('./test.png', (err, data) => {
if (err) {
console.log('操作失败');
return;
}
console.log(data);
});
console.log(fs.statSync('./test.png'));
```
```
Stats {
dev: 915514105,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 23925373020643384,
size: 1317887,
blocks: 2576,
atimeMs: 1724769221738.6213,
mtimeMs: 1718964433265.3577,
ctimeMs: 1724768416407.0315,
birthtimeMs: 1724768412410.15,
atime: 2024-08-27T14:33:41.739Z,
mtime: 2024-06-21T10:07:13.265Z,
ctime: 2024-08-27T14:20:16.407Z,
birthtime: 2024-08-27T14:20:12.410Z
}
```
- `size`:文件大小
- `birthtime`:文件创建时间
- `atime`/`mtime`/`ctime`:最后一次访问/修改文件内容/修改文件状态的时间
- 当文件内容更改时,mtime才会更新
- 更改文件任何属性(包括内容),ctime都会更新
`data.isFile()`/`data.isDirectory()`判断该文件是不是文件/文件夹
```js
const fs = require('fs');
fs.stat('./test.png', (err, data) => {
if (err) {
console.log('操作失败');
return;
}
console.log(data.isDirectory()); //false
console.log(data.isFile()); //true
});
```
##### 文件路径说明
相对路径:
- `./xxx`等效于`xxx`
- `../xxx`是上一级的文件

绝对路径:
- `D:/xxx`
- `/xxx`常见于Linux,但Windows中也可以使用,它表示在当前工作路径的根目录下使用xxx文件
- 例如当前工作路径是`C:/a/b``/xxx`指的就是`C:/xxx`;当前工作路径是`D:/a/b``/xxx`指的就是`D:/xxx`

一个小问题:现想要在`test.js`的目录下创建一个新文件`test.txt`,正常情况下应使用:
```js
fs.writeFileSync('./test.txt', '111');
```
之后在`test.js`的目录下执行
```
C:\Users\17185\Desktop\NodeJS\test> node test.js
```
![文件路径说明1](./md-image/文件路径说明1.png){:width=150 height=150}
如果我们在`test.js`的上一级目运行test.js:
```
C:\Users\17185\Desktop\NodeJS> node test/test.js
```
![文件路径说明2](./md-image/文件路径说明2.png){:width=150 height=150}
发现文件被创建在了上一级目录中
这是因为**fs中相对路径参照的是运行该文件的命令行的工作目录**,而不是该文件所在目录

---

解决办法:使用绝对路径`__dirname`
Binary file added md-image/文件夹操作1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added md-image/文件路径说明1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added md-image/文件路径说明2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 29ea3d8

Please sign in to comment.