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