567

私が取り組んでいるプロジェクト (Node.js) は、ファイル システムでの多くの操作 (コピー、読み取り、書き込みなど) を意味します。

どの方法が最速ですか?

4

17 に答える 17

853

Use the standard built-in way fs.copyFile:

const fs = require('fs');

// File destination.txt will be created or overwritten by default.
fs.copyFile('source.txt', 'destination.txt', (err) => {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
});

If you have to support old end-of-life versions of Node.js - here is how you do it in versions that do not support fs.copyFile:

const fs = require('fs');
fs.createReadStream('test.log').pipe(fs.createWriteStream('newLog.log'));
于 2012-07-02T13:52:46.980 に答える
297

同じメカニズムですが、これによりエラー処理が追加されます。

function copyFile(source, target, cb) {
  var cbCalled = false;

  var rd = fs.createReadStream(source);
  rd.on("error", function(err) {
    done(err);
  });
  var wr = fs.createWriteStream(target);
  wr.on("error", function(err) {
    done(err);
  });
  wr.on("close", function(ex) {
    done();
  });
  rd.pipe(wr);

  function done(err) {
    if (!cbCalled) {
      cb(err);
      cbCalled = true;
    }
  }
}
于 2013-01-17T20:45:13.053 に答える
148

createReadStream/createWriteStream何らかの理由でメソッドを機能させることができませんでしたが、 fs-extra npm モジュールを使用するとすぐに機能しました。ただし、パフォーマンスの違いはわかりません。

npm install --save fs-extra

var fs = require('fs-extra');

fs.copySync(path.resolve(__dirname, './init/xxx.json'), 'xxx.json');
于 2014-08-20T15:17:25.357 に答える
45

まあ、通常は非同期ファイル操作を避けるのが良いでしょう。短い (エラー処理なし) 同期の例を次に示します。

var fs = require('fs');
fs.writeFileSync(targetFile, fs.readFileSync(sourceFile));
于 2014-02-22T21:15:26.077 に答える
18

エラーイベントハンドラーのショートカットを使用したエラー処理を備えたMike Schillingのソリューション。

function copyFile(source, target, cb) {
  var cbCalled = false;

  var rd = fs.createReadStream(source);
  rd.on("error", done);

  var wr = fs.createWriteStream(target);
  wr.on("error", done);
  wr.on("close", function(ex) {
    done();
  });
  rd.pipe(wr);

  function done(err) {
    if (!cbCalled) {
      cb(err);
      cbCalled = true;
    }
  }
}
于 2014-02-24T18:23:40.193 に答える
5

node v10.0.0組み込みの で可能であるため、async/await を使用することができfs Promises APIます。

例:

const fs = require('fs')

const copyFile = async (src, dest) => {
  await fs.promises.copyFile(src, dest)
}

ノート:

現在node v11.14.0, v10.17.0、API は実験的ではなくなりました。

詳しくは:

プロミスAPI

copyFile の約束

于 2020-12-17T15:20:37.817 に答える
-1

もう1つの回答の改善。

特徴:

  • dst フォルダーが存在しない場合は、自動的に作成されます。他の答えはエラーをスローするだけです。
  • を返すためpromise、大規模なプロジェクトでの使用が容易になります。
  • 複数のファイルをコピーすることができ、すべてのファイルがコピーされると約束が果たされます。

使用法:

var onePromise = copyFilePromise("src.txt", "dst.txt");
var anotherPromise = copyMultiFilePromise(new Array(new Array("src1.txt", "dst1.txt"), new Array("src2.txt", "dst2.txt")));

コード:

function copyFile(source, target, cb) {
    console.log("CopyFile", source, target);

    var ensureDirectoryExistence = function (filePath) {
        var dirname = path.dirname(filePath);
        if (fs.existsSync(dirname)) {
            return true;
        }
        ensureDirectoryExistence(dirname);
        fs.mkdirSync(dirname);
    }
    ensureDirectoryExistence(target);

    var cbCalled = false;
    var rd = fs.createReadStream(source);
    rd.on("error", function (err) {
        done(err);
    });
    var wr = fs.createWriteStream(target);
    wr.on("error", function (err) {
        done(err);
    });
    wr.on("close", function (ex) {
        done();
    });
    rd.pipe(wr);
    function done(err) {
        if (!cbCalled) {
            cb(err);
            cbCalled = true;
        }
    }
}

function copyFilePromise(source, target) {
    return new Promise(function (accept, reject) {
        copyFile(source, target, function (data) {
            if (data === undefined) {
                accept();
            } else {
                reject(data);
            }
        });
    });
}

function copyMultiFilePromise(srcTgtPairArr) {
    var copyFilePromiseArr = new Array();
    srcTgtPairArr.forEach(function (srcTgtPair) {
        copyFilePromiseArr.push(copyFilePromise(srcTgtPair[0], srcTgtPair[1]));
    });
    return Promise.all(copyFilePromiseArr);
}
于 2017-07-15T03:12:39.173 に答える