与其他模块相同,首先引入fs文件操作模块,使用require引入。
node.js的文件操作与php类似,都是一些读,写,复制,删除等一些基本操作,但他比php要简单点,就三个参数a:追加;w:写入;r:读取,php除了有这第三种之外还有a+,w+等操作,较为复杂点。
文件操作分为两大块:文件的操作与文件夹的操作
一、文件的操作
1. 创建文件
flag对应的有三个参数:a追加 w写入 r读取
注意区分a与w的区别:
- a:是追加,在文件中添加新的东西不覆盖文件原有的东西;
- w:写入,添加新的内容覆盖文件中原有的内容;
两种方式创建文件
fs.writeFile("2.txt","我是2.txt文件",{flag:"a"},function (err) {
if(err){
console.log(err);
}else {
console.log("写入成功");
}
})
fs.appendFile("2.txt","我是追加的字符",function(err){
if(err) {
return console.log(err);
}else{
console.log("追加成功");
}
})
上面是异步创建,每个文件操作的函数都有异步和同步两种,所有同步的函数都是异步函数后面加Sync,这里以writeFileSync为例,说一下同步的函数写法,其他函数写法类似,就不一一细说了。
同步函数写法比异步简单,写入成功无返回值,不需要回调函数:
var res = fs.writeFileSync("1.txt","我是写入的内容333");
2. 文件的读取
使用readFile,第一个参数:文件名,第二个为回调函数,回调函数返回两个参数err,data
err:返回错误信息;data:返回文件内容
fs.readFile("1.txt",function(err,data){
if(err){
console.log(err);
}else{
console.log(data.toString());
}
})
3. 文件的修改
这里的文件修改不是对文件的内容经行修改,只是对文件名的修改,下面代码就是将『1.txt』的文件名修改成『2.txt』。
fs.rename("1.txt","5.txt",function(err){
if(err){
return console.log(err);
}else{
console.log("修改成功");
}
});
4. 文件删除
与php类似,使用unlink删除
fs.unlink("2.txt",function(err){
if(err){
return console.log(err);
}else{
console.log("删除成功");
}
});
5. 复制
node.js的文件操作没有特定的函数,不过我们可以自己写一个函数来复制文件
- 异步函数封装的复制函数
function mycopy(path1,path2) {
fs.readFile(path1,function(err,data){
if(err){
console.log(err);
}else{
var data1 = data.toString();
fs.writeFile(path2,data1,function(err){
if(err){
console.log(err);
}else{
console.log("复制成功");
}
})
}
})
}
- 使用同步函数更加简单,就一行代码
function mycopy(src,dest){
fs.writeFileSync(dest,fs.readFileSync(src));
}
二、文件夹的操作
对于文件夹的操作,要了解mode的三个数字的含义:mode 的三个数字,分别表示owner(所有者),group(组用户),others(其他用户)所具有的权限。
- 1 = x 执行;
- 2 = w 写;
- 4 = r 读;
比如owner具有所有权限,1+2+4=7, 又比如group 具有读 和执行权限 1+4 = 5
1. 目录创建
777代表拥有所有权限,前面的0是代表八进制,无其他意义。
下面代码的意思是创建了一个名为"33"的文件夹
fs.mkdir("33",0777,function (err) {
if(err){
return console.log(err);
}else{
console.log("创建成功");
}
})
2. 修改文件夹权限
fs.chmod("22",0777,function (err) {
if(err){
console.log(err);
}else{
console.log("修改权限成功");
}
})
3. 重命名文件夹
把"11"文件夹重命名为"22"
fs.rename("11","33",function(err){
if(err){
return console.log(err);
}else{
console.log("修改成功");
}
})
4. 读取文件夹
回调函数返回的data是数组,存的是文件夹里的文件或者文件夹名称
fs.readdir("22",function(err,data){
if(err){
return console.log(err);
}else{
console.log(data);
}
})
5. 判断文件或者文件夹是否存在
往往在新建文件夹之前得判断文件夹是否存在,若不存在才新建,此时使用exists来判断
fs.exists("22",function(exists){
if(exists){
console.log("文件夹已经存在");
}else{
// noinspection JSAnnotator
fs.mkdir("22",0777,function(err){
if(err){
return console.log(err);
}else{
console.log("创建成功");
}
})
}
})
6. 显示文件的详细信息,针对详细信息来判断是否是文件夹
详细信息的函数是stat,返回的参数data;
data.ifFile() 判断是否是文件
data.isDirectory() 判断是否是文件夹
fs.stat("22",function(err,data){
if(err){
return console.log(err);
}else{
console.log(data);
// 判断是否是文件
// 判断是否是文件夹
// data.isDirectory();
var res = data.isFile();
if(res){
console.log("是文件");
}else {
console.log("是文件夹");
}
}
});
7. 文件夹的删除
系统自带的删除函数是rmdir,但是这个函数没有多大用,因为他只能删除空的文件夹,往往在应用中,我们都是需要删除不是空的文件夹。所以删除文件夹的函数得自己写。系统没提供这个函数,但肯定难不倒我们这些程序员啊,毕竟这些封装好的底层函数也是那些大牛程序员写出来的啊。
这个删除函数只能删除空的文件夹:
fs.rmdir("22",function(err){
if(err){
return console.log(err);
}else{
console.log("删除成功");
}
})
接下来可以自己封装一个删除文件夹的函数,能删除文件夹里的所有文件
function removeDir(src) {
// 获取文件夹里的内容
var arr = fs.readdirSync(src);
console.log(arr);
// 判断是否是文件,如果是文件删除;如果是文件夹在执行相同的过程
for(var i = 0 ; i< arr.length ;i++){
// 子文件的详细信息
// 组装文件或者文件夹的路径
var url = src+"/"+arr[i];
var data = fs.statSync(url);
// 判断每个元素是文件或者是文件夹
if(data.isFile()){
fs.unlinkSync(url);
}else{
removeDir(url);
}
}
// 删除空文件夹
fs.rmdirSync(src);
}