var fs = require('fs'); var data; try{ data = fs.readFileSync('./fileForRead.txt', 'utf8'); console.log('文件内容: ' + data); }catch(err){ console.error('读取文件出错: ' + err.message); }
输出如下:
/usr/local/bin/node readFileSync.js
文件内容: hello world
异步读取
var fs = require('fs'); fs.readFile('./fileForRead.txt', 'utf8', function(err, data){ if(err){ return console.error('读取文件出错: ' + err.message); } console.log('文件内容: ' + data); });
输出如下
/usr/local/bin/node readFile.js
文件内容: hello world
通过文件流读取
适合读取大文件
var fs = require('fs'); var readStream = fs.createReadStream('./fileForRead.txt', 'utf8'); readStream .on('data', function(chunk) { console.log('读取数据: ' + chunk); }) .on('error', function(err){ console.log('出错: ' + err.message); }) .on('end', function(){ // 没有数据了 console.log('没有数据了'); }) .on('close', function(){ // 已经关闭,不会再有事件抛出 console.log('已经关闭'); });
输出如下
/usr/local/bin/node createReadStream.js
读取数据: hello world
没有数据了
已经关闭
文件写入
备注:以下代码,如果文件不存在,则创建文件;如果文件存在,则覆盖文件内容;
异步写入
var fs = require('fs'); fs.writeFile('./fileForWrite.txt', 'hello world', 'utf8', function(err){ if(err) throw err; console.log('文件写入成功'); });
同步写入
var fs = require('fs'); try{ fs.writeFileSync('./fileForWrite1.txt', 'hello world', 'utf8'); console.log('文件写入成功'); }catch(err){ throw err; }
通过文件流写入
var fs = require('fs'); var writeStream = fs.createWriteStream('./fileForWrite1.txt', 'utf8'); writeStream .on('close', function(){ // 已经关闭,不会再有事件抛出 console.log('已经关闭'); }); writeStream.write('hello'); writeStream.write('world'); writeStream.end('');
相对底层的接口
fs.write(fd, buffer, offset, length[, position], callback) fs.write(fd, data[, position[, encoding]], callback) fs.writeSync(fd, buffer, offset, length[, position]) fs.writeSync(fd, data[, position[, encoding]])
fd:写入的文件句柄。
buffer:写入的内容。
offset:将buffer从offset位置开始,长度为length的内容写入。
length:写入的buffer内容的长度。
position:从打开文件的position处写入。
callback:参数为 (err, written, buffer)。written表示有xx字节的buffer被写入。
备注:fs.write(fd, buffer, offset, length[, position], callback)跟fs.write(fd, data[, position[, encoding]], callback)的区别在于:后面的只能把所有的data写入,而前面的可以写入指定的data子串?
文件是否存在
fs.exists()已经是deprecated状态,现在可以通过下面代码判断文件是否存在。
var fs = require('fs'); fs.access('./fileForRead.txt', function(err){ if(err) throw err; console.log('fileForRead.txt存在'); }); fs.access('./fileForRead2.txt', function(err){ if(err) throw err; console.log('fileForRead2.txt存在'); });
fs.access()除了判断文件是否存在(默认模式),还可以用来判断文件的权限。
备忘:fs.constants.F_OK等常量无法获取(node v6.1,mac 10.11.4下,fs.constants是undefined)
创建目录
异步版本(如果目录已存在,会报错)
var fs = require('fs'); fs.mkdir('./hello', function(err){ if(err) throw err; console.log('目录创建成功'); });
同步版本
var fs = require('fs'); fs.mkdirSync('./hello');
删除文件
var fs = require('fs'); fs.unlink('./fileForUnlink.txt', function(err){ if(err) throw err; console.log('文件删除成功'); }); var fs = require('fs'); fs.unlinkSync('./fileForUnlink.txt');
创建目录
// fs.mkdir(path[, mode], callback) var fs = require('fs'); fs.mkdir('sub', function(err){ if(err) throw err; console.log('创建目录成功'); }); // fs.mkdirSync(path[, mode]) var fs = require('fs'); try{ fs.mkdirSync('hello'); console.log('创建目录成功'); }catch(e){ throw e; }
遍历目录
同步版本,注意:fs.readdirSync()只会读一层,所以需要判断文件类型是否目录,如果是,则进行递归遍历。
// fs.readdirSync(path[, options]) var fs = require('fs'); var path = require('path'); var getFilesInDir = function(dir){ var results = [ path.resolve(dir) ]; var files = fs.readdirSync(dir, 'utf8'); files.forEach(function(file){ file = path.resolve(dir, file); var stats = fs.statSync(file); if(stats.isFile()){ results.push(file); }else if(stats.isDirectory()){ results = results.concat( getFilesInDir(file) ); } }); return results; }; var files = getFilesInDir('../'); console.log(files);
异步版本:(TODO)
文件重命名