首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fs-extra:复制文件而不覆盖

fs-extra:复制文件而不覆盖
EN

Stack Overflow用户
提问于 2018-07-03 23:52:33
回答 2查看 3K关注 0票数 0

我正在使用fs-extra的复制方法将文件从源复制到目标。我的用例是创建一个文件副本,其名称类似于目标中存在同名的文件。fs-extra模块的copy方法会覆盖目标文件。

EN

回答 2

Stack Overflow用户

发布于 2018-07-04 16:53:34

您可以尝试如下所示:

代码语言:javascript
复制
const fs = require('fs-extra');

async function copy(src, dest) {
  try {
    await fs.copy(src, dest, { overwrite: false, errorOnExist: true });
    return true;
  } catch (error) {
    if (error.message.includes('already exists')) {
      return false;
    }
    throw error;
  }
}

async function copyWithoutOverwrite(src, dest, maxAttempts) {    
  try {
    if (!await copy(src, dest)); {
      for (let i = 1; i <= maxAttempts; i++) {
        if (await copy(src, `${dest}_copy${i}`)) {
          return;
        }
      }
    }
  } catch (error) {
    console.error(error);
  }
}

const src = '/tmp/testfile';
const dest = '/tmp/mynewfile';
const maxAttempts = 10;

copyWithoutOverwrite(src, dest, maxAttempts);
票数 0
EN

Stack Overflow用户

发布于 2021-12-02 12:34:01

所以基本上你需要实现自定义的复制过程,你可以在任何时候中断和修改。fs-jetpack在这方面做得很好。

代码语言:javascript
复制
const pathUtil = require("path");
const jetpack = require("fs-jetpack");

const src = jetpack.cwd("path/to/source/folder");
const dst = jetpack.cwd("path/to/destination/folder");

const findUnusedPath = path => {
  const pathDir = pathUtil.dirname(path);
  const extension = pathUtil.extname(path);
  const fileName = pathUtil.basename(path, extension);
  const pathCandidate = pathUtil.join(pathDir, `${fileName}-duplicate${extension}`);

  if (dst.exists(pathCandidate)) {
    // Will just add "-duplicate-duplicate-duplicate..." to name 
    // of the file until finds unused name.
    return findUnusedPath(pathCandidate);
  } else {
    return pathCandidate;
  }
};

// Iterate over all files in source directory and manually decide 
// where to put them in destination directory.
src.find().forEach(filePath => {
  const content = src.read(filePath, "buffer");
  let destPath = filePath;
  if (dst.exists(destPath)) {
    destPath = findUnusedPath(destPath);
  }
  dst.write(destPath, content);
});

这里使用文件读/写而不是复制,因为在这种特殊情况下它更快。Copy需要首先检查路径是什么:目录还是文件。如果我们已经知道它是一个文件,就不需要做这些额外的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51158684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档