Node.js 文件系统
node.js 提供一组类似 unix(posix)标准的文件操作api。
node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readfile() 和同步的 fs.readfilesync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
创建 test.txt 文件
这是在test.txt中的内容
创建 main.js 文件
var fs=require("fs"); //异步 fs.readfile("test.txt",function(err,data){ if(err){ return console.error(err); } console.log("异步:"+data.tostring()); }) //同步 var data=fs.readfilesync("test.txt"); console.log("同步:"+data.tostring());
异步模式下打开文件
fs.open(path, flags[, mode], callback)
-
path - 文件的路径。
-
flags - 文件打开的行为。具体值详见下文。
-
mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
-
callback - 回调函数,带有两个参数如:callback(err, fd)。
var fs=require("fs"); //异步 fs.open("test.txt","r+",function(err,data){ if(err){ return console.error(err); } console.log("文件打开成功"); })
异步模式获取文件信息的语法格式:
fs.stat(path, callback)
-
path - 文件路径。
-
callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.stats 对象。
var fs=require("fs"); //异步 fs.stat("test.txt","r+",function(err,stats){ if(err){ return console.error(err); } console.log(stats.isfile());//判断是否是文件 })
var fs=require("fs"); //异步 fs.stat("test.txt","r+",function(err,stats){ if(err){ return console.error(err); } console.log(stats.isfile());//判断是否是文件 console.log(stats.isdirectory());//判断是否是目录 })
var fs=require("fs"); //异步 fs.stat("test.txt",function(err,stats){ if(err){ return console.error(err); } console.log(stats); console.log(stats.isfile());//判断是否是文件 console.log(stats.isdirectory());//判断是否是目录 })
异步模式下写入文件的语法格式:
fs.writefile(file, data[, options], callback)
writefile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
-
file - 文件名或文件描述符。
-
data - 要写入文件的数据,可以是 string(字符串) 或 buffer(缓冲) 对象。
-
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
-
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
var fs=require("fs"); //异步 fs.writefile("test.txt","这是新写入的哈",function(err){ if(err){ return console.error(err); } console.log("数据写入成功"); fs.readfile("test.txt",function(err,data){ if(err){ return console.error(err); } console.log(data.tostring()); console.log("数据读取成功"); }) })
异步模式下读取文件的语法格式:
fs.read(fd, buffer, offset, length, position, callback)
-
fd - 通过 fs.open() 方法返回的文件描述符。
-
buffer - 数据写入的缓冲区。
-
offset - 缓冲区写入的写入偏移量。
-
length - 要从文件中读取的字节数。
-
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
-
callback - 回调函数,有三个参数err, bytesread, buffer,err 为错误信息, bytesread 表示读取的字节数,buffer 为缓冲区对象。
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //异步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打开成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 字节被读取"); //输出读取的字节 if(bytes>0){ console.log(buf.slice(0,bytes).tostring()); console.log("数据读取成功"); } }) })
异步模式下关闭文件的语法格式:
fs.close(fd, callback)
-
fd - 通过 fs.open() 方法返回的文件描述符。
-
callback - 回调函数,没有参数。
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //异步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打开成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 字节被读取"); //输出读取的字节 if(bytes>0){ console.log(buf.slice(0,bytes).tostring()); console.log("数据读取成功"); } //关闭文件 fs.close(fd,function(err){ if(err){ console.error(err); } console.log("文件关闭成功"); }) }) })
异步模式下截取文件的语法格式:
fs.ftruncate(fd, len, callback)
-
fd - 通过 fs.open() 方法返回的文件描述符。
-
len - 文件内容截取的长度。
-
callback - 回调函数,没有参数。
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //异步 fs.open("test.txt","r+",function(err,fd){ if(err){ return console.error(err); } console.log("文件打开成功"); //截取文件 fs.ftruncate(fd,9,function(err){ if(err){ return console.error(err); } console.log("文件截取成功"); fs.read(fd,buf,0,buf.length,0,function(err,bytes){ if(err){ return console.error(err); } console.log(bytes+" 字节被读取"); //输出读取的字节 if(bytes>0){ console.log(buf.slice(0,bytes).tostring()); console.log("数据读取成功"); } //关闭文件 fs.close(fd,function(err){ if(err){ console.error(err); } console.log("文件关闭成功"); }) }) }) })
删除文件的语法格式:
fs.unlink(path, callback)
-
path - 文件路径。
-
callback - 回调函数,没有参数。
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //删除文件 fs.unlink("test.txt",function(err){ if(err){ console.error(err); } console.log("文件删除成功"); })
创建目录的语法格式:
fs.mkdir(path[, options], callback)
-
path - 文件路径。
-
options 参数可以是:
- recursive - 是否以递归的方式创建目录,默认为 false。
- mode - 设置目录权限,默认为 0777。
-
callback - 回调函数,没有参数。
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //创建目录 fs.mkdir("temp/test/",function(err){ if(err){ return console.error(err); } console.log("目录创建成功"); })
这个案例中必须保证temp目录是存在的
可以添加 recursive: true 参数,不管temp是否存在:
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //创建目录 fs.mkdir("temp/test/",{recursive:true},(err)=>{ if(err){ throw err; } console.log("目录创建成功"); })
读取目录的语法格式:
fs.readdir(path, callback)
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //读取目录 fs.readdir("temp/test/",function(err,files){ if(err){ throw err; } files.foreach(function(file){ console.log(file); }) })
删除目录的语法格式:
fs.rmdir(path, callback)
var fs=require("fs"); var buf=new buffer.alloc(1024);//分配buffer //删除目录 fs.rmdir("temp/test/",function(err){ if(err){ throw err; } console.log("删除目录成功"); })
这里报错了,因为我要删除的目录不是空目录,得先保证目录里没有文件才能删除目录
以下再补充一些常用的操作方法,要看完整的请上官方文档
fs.rename(oldpath, newpath, callback)
异步 rename().回调函数没有参数,但可能抛出异常。
fs.chmod(path, mode, callback)
异步 chmod().回调函数没有参数,但可能抛出异常。
fs.appendfile(filename, data[, options], callback)
异步追加文件内容。
fs.watchfile(filename[, options], listener)
查看文件的修改。
fs.unwatchfile(filename[, listener])
停止查看 filename 的修改。
fs.exists(path, callback)
检测给定的路径是否存在。
fs.access(path[, mode], callback)
测试指定路径用户权限。
fs.createreadstream(path[, options])
返回readstream 对象。