MST

星途 面试题库

面试题:Node.js 复杂场景下文件移动

假设你需要在Node.js中实现一个文件移动功能,目标目录可能不存在,并且移动过程中需要记录详细的日志(包括开始时间、结束时间、源文件路径、目标文件路径等)。请编写完整的代码,并阐述如何保证移动操作的原子性,防止部分文件移动导致数据不一致。
20.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');

const rename = promisify(fs.rename);
const mkdir = promisify(fs.mkdir);

async function moveFile(sourcePath, targetPath) {
    const log = {
        start: new Date(),
        source: sourcePath,
        target: targetPath
    };

    try {
        // 检查目标目录是否存在,不存在则创建
        const targetDir = path.dirname(targetPath);
        if (!fs.existsSync(targetDir)) {
            await mkdir(targetDir, { recursive: true });
        }

        await rename(sourcePath, targetPath);

        log.end = new Date();
        console.log('File moved successfully:', log);
    } catch (err) {
        log.error = err;
        console.error('File move failed:', log);
    }
}

// 使用示例
moveFile('source.txt', 'destination/directory/target.txt');

保证移动操作原子性的方法

  1. 使用fs.rename:在Node.js中,fs.rename方法在同一文件系统内操作时是原子性的。这意味着要么整个文件移动成功,要么操作失败,不会出现部分移动的情况。
  2. 检查目标目录:在移动文件之前,先检查目标目录是否存在,如果不存在则创建它。使用fs.mkdirrecursive选项确保所有必要的目录层级都被创建。
  3. 异常处理:在try - catch块中包装fs.rename操作,以便在移动失败时能够捕获错误,确保不会出现部分移动导致的数据不一致问题。如果移动失败,源文件仍然保持在原来的位置。