nodejs实现文件同步

359 阅读2分钟

前言

通过递归遍历复制文件夹A中的所有文件至文件夹B,在复制过程中,如果遇到相同路径下存在同名文件,将会使用文件夹A中的文件来替换文件夹B中的同名文件。这样可以确保文件夹B内的文件与文件夹A保持同步,避免冲突和旧版本文件的存在。

该过程将逐一比较文件夹A和文件夹B中的文件,确保目标文件夹B中的文件与源文件夹A中的文件一致性。这种文件级别的同步机制可在软件开发、版本控制等场景中提供可靠的文件管理和保持一致性的功能。

通过这种递归复制和替换的方法,可以确保在文件夹B中的相同路径下的文件始终是最新的版本,从而避免了潜在的冲突和不一致性。这种专业的文件复制和替换机制可以提高文件管理的效率和可靠性,为项目的开发和维护提供了有力的支持。

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');

// 指定源文件夹和目标文件夹路径
let sourceFolder = './folderA'; // 源文件夹,中台文件
let targetFolder = './folderB'; // 目标文件夹

// 将异步函数转换为 Promise
const readdir = promisify(fs.readdir); // readdir函数用于读取指定路径下的目录内容,将目录中的文件和子目录作为数组返回。
const stat = promisify(fs.stat); // stat函数用于获取指定路径的文件或目录的详细信息,包括文件大小、修改时间等。
const copyFile = promisify(fs.copyFile); // copyFile函数用于将源文件复制到目标文件。它接受两个参数,分别是源文件路径和目标文件路径。
const mkdir = promisify(fs.mkdir); // mkdir函数用于创建目录。它接受两个参数,第一个参数是要创建的目录的路径,第二个参数是一个选项对象(可选),用于指定创建目录时的行为。

// 递归复制文件夹
async function copyFolder(source, target) {
  // 读取源文件夹内容
  const files = await readdir(source);

  // 遍历文件夹内容
  for (const file of files) {
    // 构建文件/文件夹路径
    const sourcePath = path.join(source, file);
    const targetPath = path.join(target, file);

    // 获取文件/文件夹的详细信息
    const stats = await stat(sourcePath);

    // 检查是否为文件夹
    if (stats.isDirectory()) {
      // 排除指定文件夹
      if (['node_modules', 'dist', '.svn'].includes(file)) {
        continue;
      }

      // 如果目标文件夹不存在,则创建
      if (!fs.existsSync(targetPath)) {
        // 在目标文件夹中创建对应的文件夹
        await mkdir(targetPath);
      }

      // 递归复制子文件夹
      await copyFolder(sourcePath, targetPath);
    } else {
      // 复制文件到目标文件夹
      await copyFile(sourcePath, targetPath);
    }
  }
}

// 执行复制操作
copyFolder(sourceFolder, targetFolder)
  .then(() => {
    console.log('文件夹复制完成');
  })
  .catch(err => {
    console.error('文件夹复制失败:', err);
  });