与其他模块相同,首先引入 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);
}
来源: http://www.jianshu.com/p/482a2d272a21