# 文件与路径

# 文件操作模块 fs

File System 文件操作系统。


// 引入文件系统  fs 模块
const fs = require("fs");

// 读取文件内容 需要硬盘操作文件,耗时
// fs.readFile('文件路径/文件名称','文件编码', callback);

// 读取上一级css目录下中的base.css
fs.readFile("../css/base.css", "UTF-8", (err, doc) => {
  console.log(err);
  if (err === null) {
    // 如果文件读取发生错误,参数err的值为错误对象,否则err的值为null
    // doc参数为文件内容
    // 错误优先的回调函数
    console.log(doc);
    console.log("文件读取成功");
    // output file contents in console
  }
});

// 写入文件内容 需要硬盘操作文件,耗时
// fs.writeFile('文件路径/文件名称','数据',callback)

const contents = 'console.log("Hello World");';
fs.writeFile("./module.exports.js", contents, (err) => {
  if (err != null) {
    console.log(err); //如果出错,打印提示信息
    console.log("文件写入失败");
    return;
  }
});

// 检查是否写入
fs.readFile("./module.exports.js", "utf-8", (err, doc) => {
  if (err === null) {
    console.log(doc);
    console.log("文件写入成功");
  }
});

# 路径操作模块 path

  • 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
  • 在读取文件或者设置文件路径时都会选择绝对路径
  • 使用__dirname 获取当前文件所在的绝对路径

// 路径拼接
// 因为linux操作系统只用/来做路径分隔符
// path.join('路径1','路径2','路径3',...)
// 引入path模块
const path = require("path");
// 路径拼接
let finialPath = path.join("itcast", "a", "b", "base.css");
// 输出结果 windows系统下输出\分隔符
console.log(finialPath); //itcast\a\b\base.css

// 相对路径VS绝对路径
// 在node.js中,大多数情况下使用绝对路径
// 使用__dirname获取当前文件所在的绝对路径
fs.writeFile(path.join(__dirname, "helloworld.js"), contents, (err) => {
  if (err != null) {
    console.log(err);
    console.log("文件写入失败");
  }
});

fs.readFile(path.join(__dirname, "helloworld.js"), "utf-8", (err, doc) => {
  console.log(err);
  console.log(doc);
  console.log("文件写入成功");
});

# 进程对象 process

let cwd = process.cwd();
console.log("当前工作路径", cwd);

# 第三方模块 glob


# 案例 解压文档

const path = require("path");
const fs = require("fs");
const compressing = require("compressing");
// 定义目录
const source = "./source/";
const middle = "./middle/";
const target = "./images/";

// 创建文件夹
if (!fs.existsSync("./images/")) fs.mkdirSync("./images/");
if (!fs.existsSync("./middle/")) fs.mkdirSync("./middle/");

// 转换为绝对路径
const absource = path.join(__dirname, source);
const abmiddle = path.join(__dirname, middle);
const abtarget = path.join(__dirname, target);

// 拿到最外层目录
let dirs = fs.readdirSync(absource);
// 传入源目录,目标目录,子目录
uncompress(absource, abmiddle, abtarget, dirs);
// 获取子目录

function uncompress(source, middle, target, dirs) {
  dirs.forEach((item) => {
    // 如果是文件
    if (fs.lstatSync(path.join(source, item)).isFile()) {
      // 创建对应文件夹
      if (!fs.existsSync(path.join(target, transformDir(item)))) fs.mkdirSync(path.join(target, transformDir(item)));
      if (!fs.existsSync(path.join(middle, transformDir(item)))) fs.mkdirSync(path.join(middle, transformDir(item)));
      // 解压zip
      console.log(path.join(middle, transformDir(item), "/word/media/"));
      compressing.zip
        .uncompress(path.join(source, item), path.join(middle, transformDir(item)))
        .then(() => {
          console.log("解压成功");
          let images = fs.readdirSync(path.join(middle, transformDir(item), "/word/media/"));
          images.forEach((image) => {
            fs.copyFileSync(
              path.join(middle, transformDir(item), "/word/media/", image),
              path.join(target, transformDir(item), image)
            );
          });
        })
        .catch((err) => {
          console.error(err);
        });
    } else {
      // 读取新的文件夹,获取子目录数组
      let newDirs = fs.readdirSync(path.join(source, item));
      // 创建目标目录
      if (!fs.existsSync(path.join(target, item))) fs.mkdirSync(path.join(target, transformDir(item)));
      if (!fs.existsSync(path.join(middle, item))) fs.mkdirSync(path.join(middle, transformDir(item)));
      uncompress(path.join(source, item), path.join(middle, item), path.join(target, item), newDirs);
    }
  });
}

function transformDir(item) {
  return item
    .replace(/.zip|.docx|.doc|\(|\)/g, "")
    .replace(/\s/g, "_")
    .trim();
}

# 案例 压缩打包

const AdmZip = require("adm-zip");
const path = require("path");
let package_file_path = path.resolve(__dirname, "../package.json");
let dist_folder_path = path.resolve(__dirname, "../dist");
const packageJSON = require(package_file_path);

let name = packageJSON.name;
let version = packageJSON.version;
let date = new Date();
let time =
  "" +
  addZero(date.getUTCMonth() + 1) +
  addZero(date.getDate()) +
  "_" +
  addZero(date.getHours()) +
  addZero(date.getMinutes());

async function createZipArchive() {
  const zip = new AdmZip();
  const outputFile = `${name}_v${version}_${time}.zip`;
  zip.addLocalFolder(dist_folder_path);
  zip.writeZip(outputFile);
  console.log(`Created ${outputFile} successfully`);
}

function addZero(num) {
  return num < 10 ? "0" + num : num;
}

createZipArchive();