NodeJS操作文件及文件夹

610 阅读4分钟

判断是文件还是文件夹

  • 同步
 // 引入文件系统模块
const fs = require('fs');  
let pathName = "D:\file"  
let stat = fs.lstatSync(pathName);  
console.log(JSON.stringify(stat))  
console.log('是否是文件:'+ stat.isFile()) //是文件吗  
console.log('是否是文件夹:'+ stat.isDirectory()) //是文件夹吗
  • 异步
const fs = require('fs');
let pathName = "E:\file"
fs.stat(pathName, function(err, data){ 
   console.log('是否是文件:'+ data.isFile()) //是文件吗
   console.log('是否是文件夹:'+ data.isDirectory()) //是文件夹吗
});

创建文件夹

  • 同步
const fs = require('fs');
let pathName = "E:\file"
if(!fs.existsSync(pathName)) {
    fs.mkdirSync(pathName);
}
  • 异步
const fs = require('fs');
fs.mkdir(mypath, (err) => {
    if(err) throw err; // 如果出现错误就抛出错误信息
    console.log('文件夹创建成功');
})

创建多层目录

  • 同步
const path = require("path");
const fs = require("fs");
let mypath = path.join(__dirname,"a","b","c","d");
if (!fs.existsSync(mypath)) {
    fs.mkdirSync(mypath, { recursive: true });
}
  • 异步
const path = require("path");
const fs = require("fs");
let mypath = path.join(__dirname,"a","b","c","d");
fs.mkdir(mypath, { recursive: true }, (err) => {
    if (err) throw err;
});

获取文件所在文件夹

let filePath;//文件路径
path.resolve(filePath)
path.dirname(filePath, "..")
  • path.resolve()
作用:path.resolve() 该方法将一些的 路径/路径段 解析为绝对路径。
语法:path.resolve( [from…],to )
说明:将参数to位置的字符解析到一个绝对路径里,[from … ]为选填项,路径源。

// __dirname当前目录, __filename当前文件绝对路径
//获取当前文件的 根目录
path.resolve(__dirname);

let path = require("path");
path.resolve('/foo/bar', './baz') => '/foo/bar/baz'
path.resolve('/foo/bar', 'baz') => '/foo/bar/baz'
path.resolve('/foo/bar', '/baz') => '/baz'
path.resolve('/foo/bar', '../baz') => '/foo/baz'
path.resolve('home','/foo/bar', '../baz') => '/foo/baz'
path.resolve('home','./foo/bar', '../baz') => '/home/foo/baz'
path.resolve('home','foo/bar', '../baz') => '/home/foo/baz'
path.resolve('home', 'foo', 'build','a1','a2','../../..', 'asset') => '/home/fo/asset'

path.resolve总是返回一个以相对于当前的工作目录(working directory)的绝对路径。

  • path.dirname()
path.dirname() 返回目录名, 尾部的目录分隔符将被忽略
path.dirname('/foo/bar/baz/asdf/a.png') => '/foo/bar/baz/asdf'

拼接文件路径

const filepath = path.join(
  "文件夹路径",
  "_temp",
  '文件名.png'
);

创建所有父级文件夹

let parent_folder = path.dirname(filepath)
try {
  if (!fs.existsSync(parent_folder)) {
     // 如果目录不存在,则递归创建目录
    fs.mkdirSync(parent_folder, {recursive: true});
  }
} catch (e) {
}

如果文件存在删除文件

if (fs.existsSync(filepath)) {
  fs.unlinkSync(filepath);
}

删除文件夹及文件

var fs = require('fs'); // 引入fs模块
function deleteAll(path) {
  var files = [];
  if(fs.existsSync(path)) {
    files = fs.readdirSync(path);
    files.forEach(function(file, index) {
      var curPath = path + "/" + file;
      if(fs.statSync(curPath).isDirectory()) { // recurse
        deleteAll(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};

读取文件内容

  • 同步
var fs=require("fs"); 
let mcontent=fs.readFileSync(filepath,"utf-8"); 
console.log(mcontent);
  • 异步
var fs=require("fs"); 
fs.readFile(filepath,'utf-8',function(err,data){ 
  if(err){ 
    console.log("error"); 
  }else{ 
    console.log(data); 
  } 
});

写入文件内容

fs.writeFileSync(filename,data,[options])
fs.writeFile(filename,data,[options],callback);
默认情况下,此API将替换文件的内容(如果已经存在)。
fs.writeFile('/Users/me/test.txt', content, { flag: 'a+' }, (err) => {})

参数说明

  • filename:文件名
  • data:需要写入的数据
  • option:options参数值为一个对象,参数如下
    • flag属性:用于指定对该文件采取何种操作,默认值为’w’(文件不存在时创建该文件,文件已存在时重写该文件),可指定值及其含义与readFile方法中使用的options参数值中的flag属性的可指定值及其含义相同。
    • mode属性:用于指定当文件被打开时对该文件的读写权限,默认值为0666(可读写)。该属性值及fs模块中的各方法中的mode参数值的指定方法均如下所示:使用4个数字组成mode属性值或?mode参数值,其中第一个数字必须是0,第二个 数字用于规定文件或目录所有者的权限,第三个数字用于规定文件或目录所有者所属用户组的权限,第四个数字规定其他人的权限。可以设定的数字如下所示:
      • 1:执行权限
      • 2:写权限
      • 4:读权限
    • encoding属性:用于指定使用何种编码格式来写入该文件。可指定属性值为“utf8”、“ascii”与“base64”。

      当data参数值为一个Buffer对象时该属性值被忽略,使用默认编码格式utf8来执行文件的写入。

  • callback:回调函数
flag的值有很多:
`w` 打开文件写入,默认值;
`w+`打开文件进行读写,如果不存在则创建文件;
`r+` 打开文件进行读写,如果不存在那么抛出异常;
`r`打开文件读取,读取时的默认值;
`a`打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
`a+`打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件

追加内容到文件底部

fs.appendFileSync(filename,data,[options])
fs.appendFile(filename,data,[options],callback)

获取路径文件名

path.basename(path[, ext])
获取路径中的文件名+文件扩展名
如果设置第二个参数表示过滤“.扩展名”,只要文件名称

path.basename('/news/beijing/focus.html') => 'focus.html'
console.log(basename1);
path.basename('/news/beijing/focus.htmll', '.html'); => 'focus'

文件重命名

fs.renameSync(new_file_path, old_file_path)
fs.rename('sample.txt', 'sample_old.txt', function (err) { 
  if (err) throw err; 
  console.log('File Renamed.'); 
});