node服务器的文件系统(一些文件操作)

node服务器的文件系统

1. 获取文件下的所有文件
function getAll(dir) {
  var filesNameArr = [];

  // 用个hash队列保存每个目录的深度
  var mapDeep = {};
  mapDeep[dir] = 0;
  // 先遍历一遍给其建立深度索引
  function getMap(dir, curIndex) {
    var files = fs.readdirSync(dir); //同步拿到文件目录下的所有文件名

    files.map(function (file) {
      //var subPath = path.resolve(dir, file) //拼接为绝对路径
      var subPath = path.join(dir, file); //拼接为相对路径
      var stats = fs.statSync(subPath); //拿到文件信息对象
      // 必须过滤掉node_modules文件夹
      if (file != "node_modules") {
        mapDeep[file] = curIndex + 1;
        if (stats.isDirectory()) {
          //判断是否为文件夹类型
          return getMap(subPath, mapDeep[file]); //递归读取文件夹
        }
      }
    });
  }
  getMap(dir, mapDeep[dir]);
  function readdirs(dir, folderName) {
    var result = {
      //构造文件夹数据
      path: dir,
      fileName: path.basename(dir),
      fileType: "directory",
      deep: mapDeep[folderName],
      uploadFileTime: "",
      type: "folder",
      url: "",
      isLike: false,
    };
    var files = fs.readdirSync(dir); //同步拿到文件目录下的所有文件名

    result.children = files.map(function (file) {
      //var subPath = path.resolve(dir, file) //拼接为绝对路径
      var subPath = path.join(dir, file); //拼接为相对路径
      var stats = fs.statSync(subPath); //拿到文件信息对象
      let size = stats.size;

      let time = formatDate(stats.birthtime);
      let suffix = file.split(".")[file.split(".").length - 1];

      var type = "";

      if (stats.isDirectory()) {
        //判断是否为文件夹类型
        return readdirs(subPath, file, file); //递归读取文件夹
      }
      var imgUrl;
      if (picTypeList.indexOf(suffix) > -1) {
        type = "picture";
        let buf = fs.readFileSync(subPath); //读取图片
        let base64 = new Buffer.from(buf).toString("base64"); //将图片数据转化为base64编码数据
        imgUrl = `data:${suffix};base64,${base64}`;
      } else if (videoTypeList.indexOf(suffix) > -1) {
        type = "video";
        let buf = fs.readFileSync(subPath); //读取图片
        let base64 = new Buffer.from(buf).toString("base64"); //将图片数据转化为base64编码数据
        imgUrl = `data:${suffix};base64,${base64}`;
      }
      return {
        //构造文件数据
        path: subPath,
        fileName: file,
        fileType: suffix,
        fileSize: size,
        uploadFileTime: time,
        type: type,
        url: imgUrl || "",
        isLike: false,
      };
    return result; //返回数据
  }
  filesNameArr.push(readdirs(dir, dir));
  return filesNameArr;
}
  1. 剪切复制文件夹
    方法一、
    function copyDirectory(src, dest) {
      var files = fs.readdirSync(src);//读取文件(src为剪切的文件路径)
      files.forEach((item, index) => {
        var itemPath = path.join(src, item);//path
        var itemStat = fs.statSync(itemPath); // 获取文件信息
        var savedPath = path.join(dest, itemPath.replace(src, ""));
        var savedDir = savedPath.substring(0, savedPath.lastIndexOf("\\"));
        if (itemStat.isFile()) {
          // 如果目录不存在则进行创建
          if (!fs.existsSync(savedDir)) {
            fs.mkdirSync(savedDir, { recursive: true });
          }
          // 写入到新目录下
          var data = fs.readFileSync(itemPath);
          fs.writeFileSync(savedPath, data);
          // 并且删除原文件
          fs.unlinkSync(itemPath);
        } else if (itemStat.isDirectory()) {
          copyDirectory(itemPath, path.join(savedDir, item));
        }
      });
      // 并且删除原目录
      fs.rmdirSync(src);
    }
    方法二、
     fs.rename(copyPath, newPath, function (err) {
              if (err) throw err;
              fs.stat(newPath, function (err, stats) {
                if (err) throw err;
                // console.log("stats: " + JSON.stringify(stats));
              });
            });
    
  2. 搜索文件
function getAllDirbyFilename(dir, str) {
  if (str === "") {
    let searchfiles = getAll(dir);
    let list = [...searchfiles[0].children];
    return list;
  } else {
    let searchfiles = getAll(dir);
    let list = [...searchfiles[0].children];
    // let files = fs.readdirSync(dir); // 该文件夹下的所有文件名称 (文件夹 + 文件)
    let resultArr = [];

    list.forEach((item) => {
      if (item.type === "folder") {
        getAllDirbyFilename(dir + "/" + item.fileName, str);
      }
      if (item.fileName.indexOf(str) > -1) {
        resultArr.push(item);
      }
    });

    return resultArr;
  }
}
  1. 删除文件夹
    const deleteFolder = (path) => {
      let files = [];
      if (fs.existsSync(path)) {
        files = fs.readdirSync(path);
        files.forEach((file) => {
          let curPath = path + "/" + file;
          if (fs.statSync(curPath).isDirectory()) {
            deleteFolder(curPath);
          } else {
            fs.unlinkSync(curPath);
          }
        });
        fs.rmdirSync(path);
      }
    };
    

    对表格内容进行操作

    let list = xlsx.parse("./deleteListInfo.xlsx");
    let department = list[0].data;
     //相对应的操作
    let xlsxObj = [
          {
            name: "删除信息",
            data: department,
          },
        ];
    let buffer = xlsx.build(xlsxObj);
    fs.writeFile(`./deleteListInfo.xlsx`, buffer, function (err) {
     if (err) throw err;
    });
    
  2. 复制文件夹

var copy = function (src, dst) {
  // 读取目录中的所有文件/目录
  fs.readdir(src, function (err, paths) {
    if (err) {
      throw err;
    }

    paths.forEach(function (path) {
      var _src = src + "/" + path,
        _dst = dst + "/" + path,
        readable,
        writable;

      fs.stat(_src, function (err, st) {
        if (err) {
          throw err;
        }

        // 判断是否为文件
        if (st.isFile()) {
          // 创建读取流
          readable = fs.createReadStream(_src);
          // 创建写入流
          writable = fs.createWriteStream(_dst);
          // 通过管道来传输流
          readable.pipe(writable);
        }
        // 如果是目录则递归调用自身
        else if (st.isDirectory()) {
          exists(_src, _dst, copy);
        }
      });
    });
  });
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值