fs.readir
、、のシーケンスを手動で再帰的fs.readfile
に実行せずに、フォルダーとそのすべてのコンテンツをコピーする簡単な方法はありますか?fs.writefile
理想的には次のように機能する関数がないのではないかと思っています。
fs.copy("/path/to/source/folder", "/path/to/destination/folder");
fs.readir
、、のシーケンスを手動で再帰的fs.readfile
に実行せずに、フォルダーとそのすべてのコンテンツをコピーする簡単な方法はありますか?fs.writefile
理想的には次のように機能する関数がないのではないかと思っています。
fs.copy("/path/to/source/folder", "/path/to/destination/folder");
これは、追加のモジュールなしでこの問題を解決するための私のアプローチです。ビルトインfs
とpath
モジュールを使用するだけです。
注:これは fs の読み取り/書き込み機能を使用するため、メタデータ (作成時間など) はコピーされません。Node.js 8.5 の時点でcopyFileSync
、OS コピー関数を呼び出してメタデータもコピーする関数が利用可能になりました。まだテストしていませんが、それらを置き換えるだけで機能するはずです。( https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flagsを参照)
var fs = require('fs');
var path = require('path');
function copyFileSync( source, target ) {
var targetFile = target;
// If target is a directory, a new file with the same name will be created
if ( fs.existsSync( target ) ) {
if ( fs.lstatSync( target ).isDirectory() ) {
targetFile = path.join( target, path.basename( source ) );
}
}
fs.writeFileSync(targetFile, fs.readFileSync(source));
}
function copyFolderRecursiveSync( source, target ) {
var files = [];
// Check if folder needs to be created or integrated
var targetFolder = path.join( target, path.basename( source ) );
if ( !fs.existsSync( targetFolder ) ) {
fs.mkdirSync( targetFolder );
}
// Copy
if ( fs.lstatSync( source ).isDirectory() ) {
files = fs.readdirSync( source );
files.forEach( function ( file ) {
var curSource = path.join( source, file );
if ( fs.lstatSync( curSource ).isDirectory() ) {
copyFolderRecursiveSync( curSource, targetFolder );
} else {
copyFileSync( curSource, targetFolder );
}
} );
}
}
ディレクトリとその内容を別のディレクトリに再帰的にコピーする関数を次に示します。
const fs = require("fs")
const path = require("path")
/**
* Look ma, it's cp -R.
* @param {string} src The path to the thing to copy.
* @param {string} dest The path to the new copy.
*/
var copyRecursiveSync = function(src, dest) {
var exists = fs.existsSync(src);
var stats = exists && fs.statSync(src);
var isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest);
fs.readdirSync(src).forEach(function(childItemName) {
copyRecursiveSync(path.join(src, childItemName),
path.join(dest, childItemName));
});
} else {
fs.copyFileSync(src, dest);
}
};
フォルダーとそのコンテンツのコピーをサポートするモジュールがいくつかあります。最も一般的なのはwrench.jsです。
// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');
代替手段はnode-fs-extraです:
fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) {
if (err) {
console.error(err);
} else {
console.log("success!");
}
}); // Copies directory, even if it has subdirectories or files
Linux/Unix OS の場合、シェル構文を使用できます。
const shell = require('child_process').execSync;
const src = `/path/src`;
const dist = `/path/dist`;
shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);
それでおしまい!
これは、Node.js 10 では非常に簡単です。
const FSP = require('fs').promises;
async function copyDir(src,dest) {
const entries = await FSP.readdir(src, {withFileTypes: true});
await FSP.mkdir(dest);
for(let entry of entries) {
const srcPath = Path.join(src, entry.name);
const destPath = Path.join(dest, entry.name);
if(entry.isDirectory()) {
await copyDir(srcPath, destPath);
} else {
await FSP.copyFile(srcPath, destPath);
}
}
}
dest
これは存在しないことを前提としています。
ほんの数ステップでソースフォルダーを別の宛先フォルダーにコピーする小さな実用的な例を作成しました( ncpを使用したshift66の回答に基づいています):
ステップ 1 - ncp モジュールをインストールします。
npm install ncp --save
ステップ 2 - copy.js を作成します ( srcPath変数とdestPath変数を必要なものに変更します)。
var path = require('path');
var ncp = require('ncp').ncp;
ncp.limit = 16;
var srcPath = path.dirname(require.main.filename); // Current folder
var destPath = '/path/to/destination/folder'; // Any destination folder
console.log('Copying files...');
ncp(srcPath, destPath, function (err) {
if (err) {
return console.error(err);
}
console.log('Copying files complete.');
});
ステップ 3 - 実行
node copy.js
このコードは問題なく機能し、任意のフォルダーを任意の場所に再帰的にコピーします。ただし、Windows のみです。
var child = require("child_process");
function copySync(from, to){
from = from.replace(/\//gim, "\\");
to = to.replace(/\//gim, "\\");
child.exec("xcopy /y /q \"" + from + "\\*\" \"" + to + "\\\"");
}
新しいプレーヤーを作成するためのテキストベースのゲームに最適です。
これが私がやった方法です:
let fs = require('fs');
let path = require('path');
それで:
let filePath = // Your file path
let fileList = []
var walkSync = function(filePath, filelist)
{
let files = fs.readdirSync(filePath);
filelist = filelist || [];
files.forEach(function(file)
{
if (fs.statSync(path.join(filePath, file)).isDirectory())
{
filelist = walkSync(path.join(filePath, file), filelist);
}
else
{
filelist.push(path.join(filePath, file));
}
});
// Ignore hidden files
filelist = filelist.filter(item => !(/(^|\/)\.[^\/\.]/g).test(item));
return filelist;
};
次に、メソッドを呼び出します。
This.walkSync(filePath, fileList)