-
-
fs.stat
检测是文件还是目录
-
-
-
fs.mkdir
创建目录
-
-
-
fs.writeFile
创建写入文件
-
-
-
fs.appendFile
追加文件
-
-
-
fs.readFile
异步读取文件,(fs.readFileSync
同步读取文件)
-
-
-
fs.readdir
读取目录
-
-
-
fs.rename
重命名
-
-
-
fs.rmdir
删除目录
-
-
-
fs.unlink
异步删除文件,(fs.unlinkSync
同步删除文件)
-
fs提供读写方法,对应参数:
- path:要打开的文件路径活文件描述
- file:协议的URL对象作为fs操作的路径
- flags:文件打开的模式
- mode:设置文件权限
flags的选项字符串及其含义
-
'a'
:打开文件用于追加。如果文件不存在,则创建该文件。 -
'a+'
:打开文件用于读取和追加。如果文件不存在,则创建该文件。 -
'as+'
打开文件用于读取和追加(在同步模式中)。如果文件不存在,则创建该文件。 -
'r'
:打开文件用于读取。如果文件不存在,则会发生异常。 -
'rs+'
:打开文件用于读取和写入(在同步模式中)。指示操作系统绕过本地的文件系统缓存。 -
'w+'
:打开文件用于读取和写入。如果文件不存在则创建文件,如果文件存在则截断文件。
同步打开文件并写入内容
const fs = require('fs');
const fd = fs.openSync('./test.txt', 'rs+');
fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
if (err) throw err; // 如果写入失败将抛出错误
console.log(written); // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
console.log(str); // 返回写入的文件内容
})
异步打开文件并写入内容
const fs = require('fs'); // 操作文件必须引入fs文件模块(包)
fs.open('./test.txt', 'rs+', (err, fd) => { // 以异步方式打开文件,fd为文件指针,指向所打开的文件
if (err) {
console.log('文件打开失败!');
return false;
}
/*
fs.write(fd,string[,position[,encoding]], callback) 一般不用
用于将 string 写入到 fd 指定的文件
--fd 文件路径或文件描述符,必选;
--string 要写入的字符串内容,也可以是一个buffer
--position 数据要被写入的位置;
--encoding 是期望的字符串编码,默认值: utf8;
--callback 回调会接收到参数(err, written, string)
written 指定传入的字符串中写入的字节数。
被写入的字节数不一定与被写入的字符串字符数相同
*/
fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加内容
if (err) throw err; // 如果写入失败将抛出错误
console.log(written); // 返回写入的字符串的所占字节数(注意:1个汉字占3个字节)
console.log(str); // 返回写入的文件内容
})
})
fs.closeSync(fd)
同步关闭文件
fs.close(fd,callback)
异步关闭文件,异步关闭存在回调函数,内部只有1异常参数err
const fs = require('fs');
fs.open('./test.txt', 'rs+', (err, fd) => {
if (err) {
console.log('文件打开失败!');
return false;
}
fs.close(fd, err => {
if (err) throw err;
// 关闭文件的回调函数体
})
})
const fs = require('fs')
// data.isFile() 判断是否为文件
// data.isDirectory()判断是否为目录
/*
fs.stat('./html', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(`是文件:${data.isFile()}`);
console.log(`是目录:${data.isDirectory()}`);
})
*/
/*
fs.mkdir()传递的三个参数
path 将创建的目录路径
mode 目录权限(读写权限),默认777
callback 回调,传递异常参数err
*/
/*
fs.mkdir('./css', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log('创建成功');
})
*/
/*
// 写入文件时,如果文件存在就直接覆盖,如果文件不存在就直接创建并写入
/*
filename (String) 文件名称
data (String | Buffer) 将要写入的内容,可以使字符串 或 buffer数据。
options (Object) option数组对象,包含:
· encoding (string) 可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
· mode (Number) 文件读写权限,默认值 438
· flag (String) 默认值 ‘w'
callback {Function} 回调,传递一个异常参数err。
*/
fs.writeFile('./html/index.html', '你好Node.js', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log('创建写入文件成功');
})
*/
// 追加文件时,如果文件存在就直接在文件后追加内容,如果文件不存在就直接创建并写入
/*
fs.appendFile('./css/style.css', 'h1{color:red}\n', (err) => {
if (err) {
console.log(err);
return;
}
console.log('appendFile成功');
})
*/
// 同步读取文件
/*
let orders = fs.readFileSync('./html/index.html', 'utf-8');
console.log(orders);
*/
/*
fs.readFile(path[, options], callback)
options:
--encoding:编码方式,默认值: null;
--flag:文件系统flag 的支持。默认值为‘r‘
callback:说明异步读取文件的回调函数,传入两个参数(err, data)
err:异常出错信息;
data:读取文件内容,若未指定字符编码,返回原始buffer
*/
/*
fs.readFile('./html/index.html', 'utf-8', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
console.log(data.toString()); // 将Buffer转换为string类型 ,不加utf-8就需要加这一句
})
*/
/*
fs.readdir('./html', (err, data) => {
if (err) {
console.log(err);
return
}
console.log(data);
})
*/
// 重命名或移动的功能
// 重命名
// fs.rename('./html/a.html', './html/b.html', (err, data) => {
// if (err) {
// console.log(err);
// return
// }
// console.log(data);
// })
// 移动
/*
fs.rename('./html/b.html', './css/b.css', (err, data) => {
if (err) {
console.log(err);
return
}
console.log('移动文件成功');
})
*/
// 删除目录,如果不加第二个参数{recursive: true }只能删除空目录而不能删除有文件的目录
/*
fs.rmdir('./aaa', { recursive: true }, (err, data) => {
if (err) {
console.log(err);
return
}
console.log('删除目录成功');
})
*/
// 删除文件
fs.unlink('./css/b.css', (err, data) => {
if (err) {
console.log(err);
return
}
console.log('删除文件成功');
})
操作
检查upload目录是否存在,不存在就创建一个
const fs = require('fs')
let path = './upload'
fs.stat(path, (err, data) => {
if (err) {
console.log(err);
mkdir(path)
return
}
if (!data.isDirectory) {
fs.unlink(path, (err, data) => {
if (!err) {
mkdir(path)
} else {
console.log('检查文件格式是否正确');
}
})
} else {
console.log('目录已经存在');
}
})
function mkdir(dir) {
fs.mkdir(dir, (err, data) => {
if (err) {
console.log(err);
return
}
})
}
对于文件的操作还可以使用三方库mkdirp https://www.npmjs.com/package/mkdirp
var mkdirp = require('mkdirp');
mkdirp('./upload/aaa/xxxx', function (err) {
if (err) {
console.error(err);
}
});
在一个目录中找出所有的目录,并将目录的名称放入一个数组中
注意:fs里面的方法是异步
方法一,使用闭包的方式:
const fs = require('fs');
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path,(err,data)=>{
if(err){
console.log(err);
return;
}
(function yy(i){
if(i === data.length){
console.log(dirArr);
return;
}
let pathName = path + '/' + data[i];
fs.stat(pathName,(err,ret)=>{
if(ret.isDirectory()){
dirArr.push(data[i])
}
yy(i+1)
})
})(0)
})
方法二:使用async和await
const fs = require('fs');
function isDirec(pathName){
return new Promise((resolve,reject)=>{
fs.stat(pathName,(err,ret)=>{
if(err){
console.log(err);
reject(err);
return;
}
if(ret.isDirectory()){
resolve(true)
}else{
resolve(false)
}
})
})
}
function main(){
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path, async (err,data)=>{
if(err){
console.log(err);
return;
}
for(let i = 0; i < data.length; i++){
let pathName = path + '/' + data[i];
if(await isDirec(pathName)){
dirArr.push(data[i])
}
}
console.log(dirArr);
})
}
main()