fs
是filesystem
的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。
导入文件系统模块(fs)语法如下所示:
var fs = require("fs")
fs.stat 检测是文件还是目录
stat方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。
fs.stat("./data/demo.js",function(err,stats){
if(err){
console.log(err)
return
}
if(stats.isFile()){
// 文件
}else if(stats.isDirectory()){
// 目录
}
})
fs.mkdir 创建目录
mkdir 方法用于新建目录
fs.mkdir('./demo',function(err){
if(err){
console.log(err)
return
}
console.log("创建成功!")
})
mkdirSync
是创建目录的同步方法
fs.mkdirSync('./demo')
fs.writeFile 创建写入文件
writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
fs.writeFile('input.txt', 'hello world!', function(err){
if(err) {
console.log(err)
return
}
console.log("写入文件成功")
})
writeFileSync
写入文件的同步方法
fs.writeFileSync('input.txt','hello World!')
fs.readFile 读取文件
readFile 方法读取的是 Buffer
,使用toString
方法转成 String
类型
fs.readFile('input.txt', function(err,data){
if(err) {
console.log(err)
return
}
console.log(data.toString())
})
readFileSync
是读取文件的同步方法
const data = fs.readFileSync('input.txt')
console.log(data.toString())
fs.appendFile 追加文件
异步地追加数据到文件,如果文件尚不存在则创建文件。 data 可以是字符串或 Buffer。
fs.appendFile('./input.txt','追加的内容',function(err,data){
if(err){
console.log(err)
return
}
console.log('追加成功!')
})
appendFileSync 是追加文件 的同步方法
try {
fs.appendFileSync('./input.txt','追加的内容')
console.log('追加成功');
} catch (err) {
console.log(err)
}
fs.readdir 读取目录
readdir
方法用于读取目录,返回一个所包含的所有文件和子目录的数组。
fs.readdir('./data', function (err, files) {
if (err) {
console.log(err)
return
}
console.log(files)
})
readdirSync
是读取文件的同步方法
try {
const files = fs.readdirSync('./data')
console.log(files);
} catch (err) {
console.log(err)
}
fs.rename 重命名
rename
方法用于文件的重命名或移动。
重命名文件
fs.rename('input.txt', 'new.txt', (err) => {
if (err) throw err;
console.log('重命名成功');
});
移动文件
fs.rename('input.txt', './data/input.txt', (err) => {
if (err) throw err;
console.log('移动文件完成');
});
renameSync 是 rename 同步版本
// 重命名
try {
fs.renameSync('input.txt', 'new.txt')
console.log("重命名成功");
} catch (err) {
console.log(err)
}
// 移动
try {
fs.renameSync('input.txt', './data/input.txt')
console.log("重命名成功");
} catch (err) {
console.log(err)
}
fs.rmdir 删除目录
rmdir
方法用于删除目录,只能删除空目录。
fs.rmdir('./demo', function (err) {
if (err) {
console.log(err)
return
}
console.log('删除目录成功')
})
rmdirSync 是删除目录的同步方法。
try{
fs.rmdirSync('./demo')
console.log("删除目录成功")
}catch(err){
console.log(err)
}
fs.unlink 删除文件
unlink
方法用于删除文件
fs.unlink('input.txt',(err)=>{
if(err){
console.log(err)
return
}
console.log('删除文件成功')
})
unlinkSync
是删除文件的同步方法
try{
fs.rmdirSync('./demo')
console.log("删除目录成功")
}catch(err){
console.log(err)
}
fs.createReadStream
createReadStream 方法用于从文件流读取数据,一般用于大型文本文件。
读取操作会触发data
事件,发送完成会触发end
事件。
const readSteam = fs.createReadStream('./input.txt')
var count = 0
var str = ""
readSteam.on('data', (data) => {
str += data
count++
})
readSteam.on('end', () => {
console.log(str)
console.log(count)
})
readSteam.on('error', (err) => {
console.log(err)
})
fs.createWriteStream
createWriteStream方法创建一个写入数据流对象,该对象的write方法用于写入数据,end方法用于结束写入操作。
var str = ""
for(var i=0;i<500;i++){
str +="写入的数据\n"
}
var writeStream = fs.createWriteStream('./input.txt');
writeStream.write(str);
writeStream.end();
writeStream.on('finish',()=>{
console.log('写入完成')
})
pipe 管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
var readStream = fs.createReadStream('input.txt')
var writeStream = fs.createWriteStream('out.txt')
readStream.pipe(writeStream)
练习
1.判断服务器上没有upload 文件,如果没有就创建目录。
如果有upload文件,需要先删除upload 文件才能创建upload文件夹。实现如下:
const fs = require('fs')
const path = "./upload"
function mkdir(path){
fs.mkdir(path,(err)=>{
if(err){
console.log(err)
return
}
console.log('创建成功')
})
}
fs.stat(path,(err,stats)=>{
if(err){
mkdir(path)
return
}
if(!stats.isDirectory()){
fs.unlink('./upload',(error)=>{
if(error){
console.log(error)
return
}
mkdir(path)
})
}
})
2.public 文件夹下有images、js、css文件夹和index.html 文件,找出public下所有的目录,放到数组中 。
const fs = require('fs')
const path = "./public"
var arr= []
fs.readdir(path, (err, files) => {
if (err) {
console.log(err)
return
}
(function getDir(i) {
if (i == files.length) {
console.log(arr)
return
}
fs.stat(path + '/' + files[i], (err,stats) => {
if (stats.isDirectory()) {
arr.push(files[i])
}
getDir(i+1)
})
})(0)
})
async/await 实现如下:
function isDir(file) {
return new Promise((resolve, reject) => {
fs.stat(file, (err, stats) => {
if (err) {
console.log(err)
reject()
return
}
if (stats.isDirectory()) {
resolve(true)
} else{
resolve(false)
}
})
})
}
function readDir() {
return new Promise((resolve, reject) => {
const path = "./public"
let arr= []
fs.readdir(path, async (err, files) => {
if (err) {
console.log(err)
reject()
return
}
for (var i = 0; i < files.length; i++){
if (await isDir(path + '/' + files[i])) {
arr.push(files[i])
}
}
resolve(arr)
})
})
}
readDir().then(res => {
console.log(res)
})