- 同步方法 sync后缀
- 异步方法 不具有后缀 有回调
系统和文件常识
chmod指令:修改文件权限
chmod 777 filename 相当于 chmod a=wxr(7=4+2+1 所有人都有读写运行的权限)
权限位: mode
- | - | - | - |
---|---|---|---|
权限分配 | 文件所有者 | 文件所属组 | 其他用户 |
权限项 | 读 | 写 | 执行 |
字符表示 | r | w | x |
数字(八进制 啥都没是0) | 4 | 2 | 1 |
执行下面命令查看文件或者文件夹权限(linux)
ls -al
drwxr-xr-rwx 3 wang staff 96 12 20 11:19 .
一共有十位
位数 | 权限 |
---|---|
8-6 | 文件所有者权限 |
5-3 | 文件所属组权限 |
2-0 | 其他用户权限 |
第九位
代码 | 含义 |
---|---|
d | 目录文件 |
p | 管道文件 |
l | 连接文件 |
- | 表示普通文件 |
s | .cos |
b | ? |
Windows权限默认是可读可写不可执行的 0o666
标识位 flag
代表对文件的操作方式
r:
r+: 可以读取 也可以写入
rs: 可以读
a: append 可以追加写入
a+: 既可以读取 也可以追加写入
ax:
wx+:
...
S代表同步
+代表增加一个相反操作
x代表排它方式
文件描述符 fd
nodejs中 分配一个数值描述符 ID自动递增的 从3开始 012被 process.stdin stdout stderr 占用了
文件基本操作
- 读取
- 写入
- 追加写入
- 拷贝
- 打开
- 关闭
- read/write 对于大文件或者位置大小文件有效
const fs = require('fs');
// 同步读取 两个参数
const buf = fs.readFileSync("data.txt",{encoding:'utf8'});
console.log(buf);
// 异步读取 三个参数
// 注意回调函数中参数的顺序 先 error 再 data 不要写反了
const data = fs.readFile("data.txt",{encoding:'utf8'},(err,data)=>{
console.log(data);
});
// 同步写入
fs.writeFileSync("data2.txt","写入的内容");
// 异步写入
fs.writeFile("data2.txt", "还是写入的内容",{encoding:'utf8'}, err=>{});
// 同步追加写入
fs.appendFileSync("data.txt", "\nthe context added");
// 异步追加写入
fs.appendFile("data.txt","\nthe second context added",()=>{});
// 同步拷贝写入 第二个参数是目标文件 如果找不到的话会自动创建 找到的话会覆盖原来的内容
fs.copyFileSync("data.txt","datacopy.txt");
// 异步拷贝写入
fs.copyFile("data.txt","datacopy2.txt", ()=>{});
// 模拟同步拷贝函数
function copy(source, target){
const data = fs.readFileSync(source);
fs.writeFileSync(target, data);
}
copy("data.txt", "data3.txt");
// 异步打开文件
// 回调参数 fd 文件描述符
// 验证文件描述符递增
fs.open("data.txt", 'r', (err, fd)=>{
console.log(fd); // 3
fs.open("data2.txt",'r', (err, fd)=>{
console.log(fd); // 4
});
});
// 异步关闭
fs.open("data.txt", "r", (err, fd)=>{
console.log('opened successfully ', fd);
fs.close(fd,err=>{
console.log('关闭成功');
});
});
// readFile()
// read() buffer
// 6 个参数
// 创建一块内存大小
const buf = Buffer.alloc(100); // byte
fs.open("data.txt", "r", (err,fd)=>{
// 一个汉子3字节
// 文件描述符 将内容读取到buf 向buffer写入的初始位置0 读取长度(不能超出设置的buf的长度) 读取的初始位置
// bytesRead 实际读取的字节数 buffer读取到的字符
fs.read(fd, buf, 0, 100, 0, (err, bytesRead, buffer)=>{
console.log(bytesRead);
console.log(buffer.toString()); // Buffer e4 bd a0 00 00 00 00 00 00 00>
});
});
// write writeFile
// 通过buffer做一个中转站 读取一段 写入一段 分段写入
// 6个参数
// 存入buffer 从buffer进行写入
const buf = Buffer.from('Marisol hola que tal');
fs.open("data.txt", "r+", (err, fd)=>{
// 文件描述符 从buffer读取 读取的初始位置 读取长度 写入的初始位置
fs.write(fd, buf, 3, 6, 3, (err, size, buffer)=>{
fs.close(fd, err=>{
console.log('closed successfully!');
});
});
});
文件目录基本操作
- 查看权限
- stats 对象
- 创建
- 读取
- 删除
sync同步:阻塞代码 导致性能差
异步: 回调函数嵌套多 推荐 Promise async/await 进行解决
const fs = require('fs');
// 同步查看文件目录权限 配合 try catch 使用
try {
fs.accessSync("./");
console.log('readable and writable');
} catch(e) {
console.log('not readable or writable');
}
// 异步
fs.access('./', err=>{
if(err){
console.log(' not accessable!');
} else {
console.log(' is accessable!')
}
});
// // 同步获取文件目录信息 stats
let file = fs.statSync('data2.txt');
console.log(file);
// // 异步
let file2 = fs.stat("data.txt",(err,data)=>{
console.log(data);
});
// 同步创建目录 必须传入目录的前面那一串路径是存在的 不然会报错(只创建写在最后的目录名)
fs.mkdirSync("b/c/d"); // b/c必须已经存在 本次创建d目录
fs.mkdir("b/f",(err=>{}));
// 异步读取目录
console.log(fs.readdirSync("b"))
// 同步删除文件目录
fs.rmdir("b/f",()=>{});
// 同步删除文件
fs.unlinkSync("a/data2.txt");
使用Promise配合 async/await 的例子
// 读取doc目录下的文件
const fs = require("fs");
const path = require("path");
function getFile(){
return new Promise((resolve, reject) => {
const filePath = path.resolve(__dirname,"./doc");
fs.readdir(filePath,(err, files)=>{
const fileArr = [];
files.forEach(fileName=>{
fileArr.push("/coc/" + fileName);
});
resolve(fileArr);
});
});
}
async function getFilePath(){
const filePath = await getFile();
return filePath;
}
function insertDB(){
getFilePath().then(res=>{
// do something to insert into DB
console.log(res);
});
}
insertDB();