很久没搞nodejs了 , node版本从4升到7 , 迭代很快,现在过来复习一下文件相关的api,虽说有些api不推荐使用或者说过时了,但是还能跑 :)
-
readFile 和 readFileSync 同步读取文件和异步读取文件,在官方文档上已经说的很清晰了,API也讲的很明白,只要玩好API就行。
"use strict"; const fs = require('fs'); // 简单的异步读取 fs.readFile('yourFilePath','utf8',function(err,data){ if(err) throw err; console.log(data); }); // 简单的同步读取 try{ var data = fs.readFileSync('yourFilePath','utf8'); console.log(data); // 文件数据 }catch(e){ console.log(e); }
-
writeFile 和 writeFileSync 同步和异步读写文件
"use strict"; const fs = require('fs'); const path = require('path'); // 注意这两种方式都会对文件造成覆盖写入。 // 且只能针对小文件。 // 异步写入 fs.writeFile(path.join(__dirname,'yourFileName'),'hello',function(err){ if(err) console.log(err.code); console.log('文件异步写入成功!'); }); // 同步写入 try { fs.writeFileSync(path.join(__dirname, 'yourFileName'),'world'); console.log('文件同步写入成功!'); } catch(e) { console.log('文件同步写入失败!'); }
-
exists 和 existsSync 判断文件是否存在,同步和异步方式 , 验证文件是否存在api
"use strict"; const fs = require('fs'); const path = require('path'); let _path = path.join(__dirname,'yourFileName'); // 异步 fs.exists(_path,(exists)=>{ console.log('exists ' + exists); }); // 同步判断文件是否存在 var flag = fs.existsSync(_path); console.log('flag ' + flag);
-
stat 和 statSync 获取文件信息API
"use strict"; const fs = require('fs'); const path = require('path'); let _path = path.join(__dirname,'yourFileName'); // 异步获取文件信息API fs.stat(_path,(err,stats)=>{ if (err) throw err; console.log(`文件大小: ${stats.size} 字节`); console.log(`文件创建时间: ${stats.ctime} `); console.log(`文件最后访问时间: ${stats.atime} `); // 判断路径是文件或者是文件夹 if(stats.isFile()){ console.log('该路径代表一个文件'); }else if(stats.isDirectory()){ console.log('该路径代表一个目录'); } }); // fs 同步读取文件信息 let stats = fs.statSync(_path); if(stats.isFile()){ console.log('同步方式,该路径代表一个文件'); }else if(stats.isDirectory()){ console.log('同步方式,该路径代表一个目录'); }
-
rmdir 和 rmdirSync 删除文件夹,同步和异步方式
"use strict"; const fs = require('fs'); const path = require('path'); let _path = path.join(__dirname,'yourDir'); // 进行删除和创建文件夹的时候都要先判断文件是否存在 // 异步方式删除 fs.exists(_path,(exists)=>{ if(exists){ // 如果存在,则删除目录 return fs.rmdir(_path,(err)=>{ if(err) return console.log('文件删除失败!'); console.log('文件删除成功'); }); } // 如果不存在,才去创建目录 fs.mkdir(_path,(err)=>{ if (err) return console.log('目录未创建成功!'); console.log('目录创建成功!'); }); }); // 同步方式 (如果存在,删除;不存在,创建) var flag = fs.existsSync(_path); flag ? fs.rmdirSync(_path) : fs.mkdirSync(_path);
-
watchFile 和 unwatchFile 以及 watch 监听文件变化和停止监听
"use strict" const fs = require('fs'); const path = require('path'); let filePath = path.join(__dirname,'yourFileName'); let filePath2 = path.join(__dirname,'yourFileName2'); // 参数 var json = { persistent:true, interal:100 }; // 监听器 var listener = function(cur,pre){ console.log(`当前文件修改时间:${cur.mtime}`); console.log(`上次文件修改时间:${pre.mtime}`); }; // 监视文件的变化 fs.watchFile(filePath,json,listener); // 3s 后停止监听文件变化 setTimeout(function(){ console.log('go'); fs.unwatchFile(filePath,listener); },3000); // 使用watch监听---------------------------- // 参数 var option = { persistent:true, recursive:true, encoding:'utf8' } // 监视器 var watchListener = function(eventType, filename){ console.log('eventType ' + eventType); console.log('filename ' + filename); } // 开始监听 var watcher = fs.watch(filePath2,option,watchListener); // 1s 后停止监听 setTimeout(function(){ console.log('goes'); watcher.close(); },1000);
- 备注: The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations. The recursive option is only supported on OS X and Windows.
-
readStream 和 writeStream 文件读取流和文件写入流
"use strict"; const fs = require('fs'); const path = require('path'); let filePath = path.join(__dirname, 'yourFileName') ; let distPath = path.join(__dirname, 'fileNameYouWant'); // 创建一个文件读取流 let readStream = fs.createReadStream(filePath); // 创建一个文件写入流 let writeStream = fs.createWriteStream(distPath); // 读取流的 data 事件会被不停触发 readStream.on('data', function (chunk) { writeStream.write(chunk); // 读一点,写一点儿 }); // 读取结束将会触发 end 事件 readStream.on('end', function (chunk) { console.log('拷贝结束'); });
-
使用pipe管道来边读边写
"use strict"; const path = require('path'); const fs = require('fs'); let filePath = path.join(__dirname,'yourFileName'); let distPath = path.join(__dirname,'fileNameYouWant'); fs.createReadStream(filePath).pipe(fs.createWriteStream(distPath));
-
readline 按行来读取
"use strict"; const path = require('path'); const fs = require('fs'); const readline = require('readline'); let json = { input:fs.createReadStream(path.join(__dirname,'theFileYouWantCopy'),'utf8') } let distPath = path.join(__dirname,'fileYouWantGenerate'); const rl = readline.createInterface(json); // 创建一个行文件读取接口 // 读取行事件 rl.on('line',(line)=>{ // fs.appendFile 不会覆盖原文件 fs.appendFile(distPath,'\n' + line,'utf8',(err)=>{ if(err) return console.log(err); console.log('do line copy'); }); }); // 读取完毕事件 rl.on('close',()=>{ console.log('读取完成!'); // 上面fs.appendFile是异步,此处可能会先输出,没有什么影响。 });
-
其他问题
- 文件编码转换 ,在nodejs中有个插件:iconv-lite
- 首先安装插件:
npm i --save iconv-lite
- 示例代码:
"use strict"; const fs = require('fs'); const iconv = require('iconv-lite'); const path = require('path'); let filePath = path.join(__dirname,'gbk.txt'); // 假设这是你的gbk编码的文件 let distPath = path.join(__dirname,'utf8.txt'); // 假设这是你想重新输出的utf8文件 fs.readFile(filePath,function (err, data) { if (err) throw err; // iconv的decode方法就可以用来解码,需指定一个原始的二进制数据和字符集编码 let res =iconv.decode(data, 'gbk'); // 先判断是否存在,存在则append , 不存在,直接写。 fs.exists(distPath,(exists)=>{ if(exists){ fs.appendFile(distPath,'\n' + res,'utf8',(err)=>{ if(err) throw err; console.log('追加成功!'); }); }else{ fs.writeFile(distPath,res,'utf8',(err)=>{ if(err) throw err; console.log('写入完成!'); }); } }); });
- 操作文件扩展包地址:fs-extra点击这里
- 常用nodejs第三方包: node-awesome
- 首先安装插件: