Node.js文件系统
Node.js文件系统
(fs模块的使用)
Node实现文件I/O使用标准的POSIX函数的简单包装。Node文件系统(FS--FileSystem)模块可以使用以下语法输入:
var fs = require("fs")
一、同步和异步
所有文件系统操作都具有同步和异步形式。供开发者选择
异步的形式总是将完成回调作为其最后一个参数。传给完成回调的参数取决于具体方法,但第一个参数始终预留用于异常。如果操作成功完成,则第一个参数是null或undefined。
二、什么是回调?
所谓“回调”,就是”回头再调”。回调函数并不是马上调用,而是需要等到事件触发了以后再执行。回调是一个异步等效的功能,在完成特定任务后回调函数被调用。
三、FS模块的常用函数:
1、读文件
(1)readFile():用于异步读取数据。 - - - - 非阻塞方式读
fs.readFile(fileName, function (err, buffer) {
if (err) throw err;
process(buffer);
});
readFile方法的第一个参数是文件的路径,可以是绝对路径,也可以是相对路径。注意,如果是相对路径,是相对于当前进程所在的路径(process.cwd()),而不是相对于当前脚本所在的路径。
readFile方法的第二个参数是读取完成后的回调函数。该函数的第一个参数是发生错误时的错误对象,第二个参数是代表文件内容的Buffer实例。
(2)readFileSync():用于同步读取文件,返回一个字符串。- - - -阻塞方式
var text = fs.readFileSync(fileName, 'utf8');
readFileSync方法的第一个参数是文件路径,第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串。默认的配置对象是{ encoding: null, flag: 'r' },即文件编码默认为null,读取模式默认为r(只读)。如果第二个参数不指定编码(encoding),readFileSync方法返回一个Buffer实例,否则返回的是一个字符串。
示例:创建一个名为input.txt的文件(内容自定)
var fs = require("fs");
// 异步读
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读: " + data.toString());
});
console.log("Program Ended");
// 同步读
var data = fs.readFileSync('input.txt');
console.log("同步读: " + data.toString());
console.log("Program Ended");
这两个例子说明非阻塞和阻塞调用的概念。
第一个例子(异步读-非阻塞)程序不等待文件读取,它只是进行打印“Program Ended”,同时程序无阻塞继续读取文件。
第二个例子(同步读-阻塞)直到它读取该文件,然后才前进到结束程序的地方。
2、打开一个文件:在异步模式下打开文件的语法是
fs.open(path, flags[, mode], callback)
参数的说明:
path - 文件名,包括路径字符串。
flags - 标志要打开的文件的方式。
mode - 设置文件模式,但前提是已创建该文件。它默认为0666,读取和写入。
callback - 这是回调函数,有两个参数(err, fd)。
flags参数的取值:
示例:
var fs = require("fs");
// 异步 - 打开文件
console.log("Going to open file!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("File opened successfully!");
});
3、获取文件信息:它产生一个对象,该对象包含了该文件或目录的具体信息。通过该方法,判断正在处理的是一个文件,还是一个目录。
fs.stat(path, callback)
参数的说明:
path - 文件名,包括路径字符串。
callback - 回调函数得到两个参数(err, stats) 。
示例:
var fs = require("fs");
console.log("Going to get file info!");
fs.stat('input.txt', function (err, stats) {
if (err) {
return console.error(err);
}
console.log(stats);
console.log("Got file info successfully!");
// Check file type
console.log("isFile ? " + stats.isFile());
console.log("isDirectory ? " + stats.isDirectory());
});
4、写入文件
(1)writeFile --- 异步写入文件
fs.writeFile(filename, data[, options], callback)
如果文件已经存在将会覆盖文件
参数的说明:
filename - 文件名,包括路径字符串
data - 字符串或缓冲区将被写入到文件中
options - 一个对象,用于指定编码格式。默认编码是UTF8。
callback - 回调函数获取一个参数err,用于在发生任何写入错误时返回错误。
示例:
var fs = require("fs");
console.log("Going to write into existing file");
fs.writeFile('input.txt', 'Simply Easy Learning!', function(err) {
if (err) {
return console.error(err);
}
console.log("Data written successfully!");
console.log("Let's read newly written data");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("Asynchronous read: " + data.toString());
});
});
(2)writeFileSync:同步写入文件
fs.writeFileSync(fileName, str, 'utf8');
5、读取文件 --- 二进制方式(按字节读取)
fs.read(fd, buffer, offset, length, position, callback)
参数的说明:
fd - 通过文件fs.open()方法返回的文件描述符
buffer - 被写入数据的缓冲区
offset - 偏移量,开始写入缓冲区的位置
length - 整数,指定要读取的字节数
position - 整数,指定从文件中开始读取。如果位置为null,数据将从当前文件位置读取。
callback - 回调函数获取三个参数,(err, bytesRead, buffer).
示例:
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("File opened successfully!");
console.log("Going to read the file");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
console.log(bytes + " bytes read");
// Print only read bytes to avoid junk.
if(bytes > 0){
console.log(buf.slice(0, bytes).toString());
}
});
});
6、关闭文件
fs.close(fd, callback)
参数的说明:
fd - 这是通过文件fs.open()方法返回的文件描述符。
callback - 这是回调函数
示例:
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("File opened successfully!");
console.log("Going to read the file");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
// Print only read bytes to avoid junk.
if(bytes > 0){
console.log(buf.slice(0, bytes).toString());
}
// Close the opened file.
fs.close(fd, function(err){
if (err){
console.log(err);
}
console.log("File closed successfully.");
});
});
});
7、创建目录
fs.mkdir(path[, mode], callback)
参数说明:
path - 包括路径的目录名。
mode - 要设置的目录权限。
callback - 回调函数
var fs = require("fs");
console.log("Going to create directory /tmp/test");
fs.mkdir('./tmp',function(err){
if (err) {
return console.error(err);
}
console.log("Directory created successfully!");
});
8、读取目录
fs.readdir(path, callback)
参数说明:
path - 包括路径的目录名。
callback - 回调函数,两个参数(err, files),其中文件的文件名的目录中的数组排除 '.' 和 '..'
示例:
var fs = require("fs");
console.log("Going to read directory");
fs.readdir("../buffer",function(err, files){
if (err) {
return console.error(err);
}
files.forEach( function (file){
console.log( file );
});
});
9、删除目录
fs.rmdir(path, callback)
参数说明:
path - 包括路径的目录名。
callback - 回调函数
示例:
var fs = require("fs");
console.log("Going to delete directory");
fs.rmdir("../buffer/a1",function(err){
if (err) {
return console.error(err);
}
console.log("Going to read directory");
fs.readdir("../buffer",function(err, files){
if (err) {
return console.error(err);
}
files.forEach( function (file){
console.log( file );
});
});
});
10、文件复制:
fs.copyFile(源文件,目标文件,回调函数)
fs.copyFile('e:/demo.txt','../buffer/deyun/dd.txt',(err)=>{
if(err){
return console.log(err)
}
console.log('文件复制成功')
})
11、给文件中追加内容:将内容添加到文件的末尾,若给定的文件不存在则创建文件,创建的新文件名就是给定的文件名
fs.appendFile(filename,content,callback)
filename:文件名(含路径)
content:内容
callback:回调函数
fs.appendFile('../buffer/deyun/dd.txt','身体健康!',(err)=>{
if(err){
return console.log(err)
}
console.log('追加内容成功')
})
12、删除文件
fs.unlink(path, callback)
参数说明:
path - 文件路径。
callback - 回调函数,没有参数。
var fs = require("fs");
var filename = '../buffer/aa.txt';
fs.unlink(filename, function(err) {
if (err) {
return console.log('删除失败');
}
console.log("删除成功");
});
13、重命名
fs.rename(oldPath, newPath, callback)
参数说明:
oldPath <String> | <Buffer>
newPath <String> | <Buffer>
callback <Function> 回调只有一个可能的异常参数
var fs = require("fs");
var filename = '../buffer/aa.txt';
fs.rename(filename,'../buffer/bb.txt',function(err){
console.log(err);
})