Javascript-在目录之间移动文件

时间:2018-08-22 06:47:06

标签: javascript node.js

我有一个名为“已接收”的文件夹,还有另外两个名为“成功”和“错误”的文件夹。 所有新文件都将存储在“已接收”文件夹中,并在存储在所述文件夹中后,将由我的系统处理。成功解析的文件将被移到“成功”文件夹,而所有有问题的文件将被存储在“错误”文件夹中。

我主要关心的是基本上在目录之间移动文件。

我已经尝试过了:

// oldPath = Received Folder
// sucsPath = Successful Folder
// failPath = Error Folder

// Checks if Successful or fail. 1 = Success; 0 = Fail
if(STATUS == '1') { // 1 = Success;
  fs.rename(oldPath, sucsPath, function (err) {
    if (err) {
      if (err.code === 'EXDEV') {
        var readStream = fs.createReadStream(oldPath);
        var writeStream = fs.createWriteStream(sucsPath);

        readStream.on('error', callback);
        writeStream.on('error', callback);

        readStream.on('close', function () {
          fs.unlink(oldPath, callback);
        });

        readStream.pipe(writeStream);
      }
      else {
        callback(err);
      }
      return;
    }
    callback();
  });
}
else { // 0 = Fail
  fs.rename(oldPath, failPath, function (err) {
    if (err) {
      if (err.code === 'EXDEV') {
        var readStream = fs.createReadStream(oldPath);
        var writeStream = fs.createWriteStream(failPath);

        readStream.on('error', callback);
        writeStream.on('error', callback);

        readStream.on('close', function () {
          fs.unlink(oldPath, callback);
        });

        readStream.pipe(writeStream);
      }
      else {
        callback(err);
      }
      return;
    }
    callback();
  });
}

但是我这里担心的是,它删除了原始文件夹并将所有文件传递到指定的文件夹中。我相信代码中的逻辑是,它从字面上重命名了文件(包括目录)。我还遇到了“ await moveFile”,但是它基本上做同样的事情。

我只想通过简单地指定文件名,文件的来源及其目的地来在目录之间移动文件。

2 个答案:

答案 0 :(得分:0)

正如rufus1530所提到的,我使用了它:

fs.createReadStream(origin).pipe(fs.createWriteStream(destination)); 

下一步是删除文件。

我用了这个:

fs.unlinkSync(file);

答案 1 :(得分:0)

从8.5开始,您拥有fs.copyFile,这是复制文件的最简单方法。

因此,您将创建自己的移动函数,该函数将首先尝试重命名,然后尝试复制。

const util = require('util')
const copyFile = util.promisify(fs.copyFile)
const rename = util.promisify(fs.rename)
const unlink = util.promisify(fs.unlink)
const path = require('path')    

async function moveFileTo(file, dest) {
  // get the file name of the path
  const fileName = path.basename(file)

  // combine the path of destination directory and the filename
  const destPath = path.join(dest, fileName)

  try {
     await fs.rename(file, destPath)
  } catch( err )  {
     if (err.code === 'EXDEV') {
       // we need to copy if the destination is on another parition
       await copyFile(file, destPath)

       // delete the old file if copying was successful
       await unlink(file)
     } else {
       // re throw the error if it is another error
       throw err
     }
  }
}

然后您可以使用await moveFileTo('/path/to/file.txt', '/new/path')这样的方式来使用它,它将/path/to/file.txt移到/new/path/file.txt