文件 I/O 是由简单封装的标准 POSIX 函数提供的。 通过 require('fs') 使用该模块。 所有的方法都有异步和同步的形式。
异步形式始终以完成回调作为它最后一个参数。 传给完成回调的参数取决于具体方法,但第一个参数总是留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined
//异步示例 var fs = require('fs'); fs.unlink('/tmp/hello', function(err){ if (err) throw err; console.log('successfully deleted /tmp/hello'); });
当使用同步形式时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让它们往上冒泡
//同步示例 var fs = require('fs'); fs.unlinkSync('/tmp/hello'); console.log('successfully deleted /tmp/hello');
异步方法不保证执行顺序。 所以下面的例子容易出错
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; console.log('renamed complete'); }); fs.stat('/tmp/world', function(err, stats){ if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); });
fs.stat
可能在 fs.rename
之前执行。正确的方法是把回调链起来
fs.rename('/tmp/hello', '/tmp/world', function(err){ if (err) throw err; fs.stat('/tmp/world', function(err, stats){ if (err) throw err; console.log('stats: ${JSON.stringify(stats)}'); }); });
推荐开发者使用这些函数的异步版本。 同步版本会阻塞整个进程,直到它们完成(停止所有连接)
1、打开文件【fs.open(path, flags[, mode], callback)】
参数如下:
path| flags | mode 设置文件模式(权限和 sticky 位),但只有当文件被创建时才有效。默认为 0666
,可读写 callback该回调有两个参数 (err错误, fd文件标识,与定时器标识类似)
flags可以是:
'r' - 以读取模式打开文件。如果文件不存在则发生异常。 'r+' - 以读写模式打开文件。如果文件不存在则发生异常。 'rs+' - 以同步读写模式打开文件。命令操作系统绕过本地文件系统缓存。 'w' - 以写入模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。 'wx' - 类似 'w',但如果 path 存在,则失败。 'w+' - 以读写模式打开文件。文件会被创建(如果文件不存在)或截断(如果文件存在)。 'wx+' - 类似 'w+',但如果 path 存在,则失败。 'a' - 以追加模式打开文件。如果文件不存在,则会被创建。 'ax' - 类似于 'a',但如果 path 存在,则失败。 'a+' - 以读取和追加模式打开文件。如果文件不存在,则会被创建。 'ax+' - 类似于 'a+',但如果 path 存在,则失败。
[注意]使用'rs+'模式不会使fs.open()进入同步阻塞调用。如果那是你想要的,则应该使用fs.openSync()
var fs = require('fs'); fs.open('a.txt','r',function(err,fs){ console.log(err);//null console.log(fs);//3 })
var fs = require('fs'); fs.open('b.txt','r',function(err,fs){ /* { Error: ENOENT: no such file or directory, open 'D:\project\b.txt' at Error (native) errno: -4058, code: 'ENOENT', syscall: 'open', path: 'D:\\project\\b.txt' } */ console.log(err); console.log(fs);//undefined })
文件的回调函数中的第二个参数fd代表文件标识,与定时器标识类似,用于标识文件,且随着文件的打开顺序递增
var fs = require('fs'); fs.open('1.txt','r',function(err,fs){ console.log(fs);//3 }) fs.open('2.txt','r',function(err,fs){ console.log(fs);//4 })
【fs.openSync(path, flags[, mode])】
fs.open() 的同步版本。 返回一个表示文件描述符的整数
var fs = require('fs'); var result = fs.openSync('1.txt','r'); console.log(result);//3
2、读取文件【fs.read(fd, buffer, offset, length, position, callback)】
参数如下:
fd通过 fs.open() 方法返回的文件描述符 buffer | 数据将被写入到buffer offset buffer中开始写入的偏移量 length 指定要读取的字节数(整数) position 指定从文件中开始读取的位置(整数)。 如果position为null,则数据从当前文件位置开始读取 callback 回调有三个参数 (err, bytesRead, buffer)。err为错误信息,bytesRead表示读取的字节数,buffer为缓冲区对象
由于使用read()方法,会将文件内容读取buffer对象中,所以需要提前先准备一个buffer对象