Node.js এ পুনরাবৃত্তভাবে ফোল্ডারটি অনুলিপি করুন


154

সেখানে নিজ হাতে একটা ক্রম না করে একটি ফোল্ডার এবং এর সমস্ত বিষয়বস্তু কপি করার জন্য একটি সহজ উপায় আছে কি fs.readir, fs.readfile, fs.writefileযাও recursively?

আমি ভাবছি যে আমি কোনও ফাংশন মিস করছি যা আদর্শভাবে এইভাবে কাজ করবে would

fs.copy("/path/to/source/folder","/path/to/destination/folder");

3
কোনও মডিউল ছাড়াই এটি করার কোনও উপায় আছে? হতে পারে একটি পুনরাবৃত্ত ফাংশন / কোড স্নিপ-ইট?
সুকিমা

@ সুকিমা - আমার উত্তর এখানে দেখুন
jmort253

উত্তর:


121

আপনি এনসিপি মডিউল ব্যবহার করতে পারেন । আমি মনে করি এটি আপনার প্রয়োজন


2
পারফেক্ট! npm install ncpএবং 30 এরও কম সময়ে কাজ করা। ধন্যবাদ।
এজেসবিস

1
আমার জন্য রেঞ্চ ভাল, কারণ এটি আরও বিকল্প সমর্থন করে। এনসিপি দিয়ে আপনি উদাহরণস্বরূপ সমাধান করতে পারবেন না।
স্লাভা ফমিন দ্বিতীয়

3
আশ্চর্যজনক বোনাস হিসাবে, একটি ক্রস প্ল্যাটফর্ম এনএমপি রান স্ক্রিপ্টগুলিতে এনসিপি ব্যবহার করতে পারে।
সিয়ানটিক

আমি কিছু সাধারণ কেস পেয়েছি যেখানে এনসিপি আমার কলব্যাকে যায় না যেখানে fs- অতিরিক্ত সঠিকভাবে ঘটে।
bumpmann

40
অনুগ্রহ করে নোট করুন যে এনসিপিটি আপাতদৃষ্টিতে উপস্থিত রয়েছেএর পরিবর্তে সম্ভবত সম্ভবত সেরা বিকল্প s
ক্রিস

74

কোনও অতিরিক্ত মডিউল ছাড়াই এই সমস্যাটি সমাধান করার জন্য এটি আমার পদ্ধতির। কেবল অন্তর্নির্মিত fsএবং pathমডিউলগুলি ব্যবহার করে ।

দ্রষ্টব্য: এটি fs এর পঠন / লেখার ফাংশন ব্যবহার করে যাতে এটি কোনও মেটা ডেটা (তৈরির সময় ইত্যাদি) অনুলিপি করে না। নোড ৮.৫ অনুসারে একটি copyFileSyncফাংশন উপলব্ধ রয়েছে যা ওএস অনুলিপি ফাংশনগুলিকে কল করে এবং তাই মেটা ডেটাও অনুলিপি করে। আমি এখনও এগুলি পরীক্ষা করি নি তবে কেবল তাদের প্রতিস্থাপনের জন্য এটি কাজ করা উচিত। ( 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 );
            }
        } );
    }
}

এটি ফোল্ডারগুলির কপি করে না যদি তাদের নামে জায়গা থাকে
31415926

আমার জন্য এটি ফোল্ডারগুলি তাদের নামে ফাঁকা স্থান সহ অনুলিপি করে। সম্ভবত এটি @ ভিক্টর দ্বারা সংশোধন করা ত্রুটির কারণে হয়েছিল। যেহেতু আমি এই ফাংশনটি বেশ নিয়মিত ব্যবহার করছি (বর্তমান অবস্থায় আমি যেমন একই সংশোধন বিজয়ীর সাথে আপডেট করতে ভুলে গেছি), আমি নিশ্চিত যে এটি সাধারণভাবে কাজ করে।
সাইমন জাইক্স

1
এছাড়াও প্রয়োজন: javascript var fs = require('fs'); var path = require('path');
টাইলার

2
এটি আসলে ফাইলগুলি অনুলিপি করে না। এটি তাদের পড়ার পরে তাদের লিখেছে। এটি অনুলিপি করা হয় না। অনুলিপি তৈরির তারিখের পাশাপাশি অন্যান্য মেটা ডেটা স্ট্রিমগুলি অন্তর্ভুক্ত করে যা উইন্ডোজ এবং ম্যাকওএস উভয়ই সমর্থন করে এবং এই কোড দ্বারা অনুলিপি করা হয়নি। নোড 8.5 হিসাবে আপনার কল করা উচিত fs.copyবা fs.copySyncম্যাকওএস এবং উইন্ডোজে ওএস লেভেলের অনুলিপি ফাংশনগুলিকে প্রকৃতপক্ষে কল করে এবং তাই ফাইলগুলি অনুলিপি করে।
gman

1
দুঃখিত এটি fs.copyFileএবং যদি নোড উত্সের মাধ্যমে আপনার খোঁড়াখুঁড়ি আপনি ম্যাক এবং উইন্ডোতে দেখতে পাবেন তারা কোনও ফাইল অনুলিপি করার জন্য ওএস নির্দিষ্ট ফাংশনটি কল করে
g

52

কিছু মডিউল রয়েছে যা তাদের সামগ্রীতে ফোল্ডারগুলি অনুলিপি করতে সহায়তা করে। সবচেয়ে জনপ্রিয় হবে রেঞ্চ

// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');

একটি বিকল্প নোড-এফএস-অতিরিক্ত হবে

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

3
মোচড় বিফল হয় অনুলিপির ডিরেক্টরির একটি সিম্বোলিক লিঙ্ক ধারণ
DoubleMalt

2
ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে উইন্ডোজে এটি ব্যর্থ হয়, এনসিপি ব্যাগের ঠিক বাইরে কাজ করে।
সেলেঙ্কিত

6
নোড-এফএস-অতিরিক্ত আমার জন্য কাজ করেছে। এটি মূল fs এর উত্তরাধিকার সূত্রে প্রাপ্ত এবং আমি প্রক্রিয়াটি পরিচালনা করার উপায় পছন্দ করি। অ্যাপটিতে আপডেট করার জন্য কম কোড।
ডিভিডিএমএন

15
দয়া করে নোট করুন যে অবহেলাwrench করা হয়েছে এবং প্রতিস্থাপন করা উচিত node-fs-extra( github.com/jprichardson/node-fs-extra )
অ্যাম্বিডেক্স

1
রেঞ্চ আসলে ফাইলগুলি অনুলিপি করে না। এটি তাদের পড়ার পরে তাদের লিখেছে, তারপরে তাদের তারিখ অনুলিপি করে। এটি অনুলিপি করা হয় না। অনুলিপিতে অন্যান্য মেটা ডেটা স্ট্রিম রয়েছে যা উইন্ডোজ এবং ম্যাকওএস উভয়ই সমর্থন করে এবং রেঞ্চ দ্বারা অনুলিপি করা হয় না।
gman

38

এখানে এমন একটি ফাংশন যা পুনরাবৃত্তভাবে একটি ডিরেক্টরি অনুলিপি করে এবং এটি অন্য ডিরেক্টরিতে অন্তর্ভুক্ত থাকে:

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);
  }
};

3
এমনকি যদি আপনি একটি আসল অনুলিপি ফাংশন সন্নিবেশ করান তবে আপনাকে প্রতীকী লিঙ্কগুলি অনুসরণ না করা উচিত ( fs.lstatSyncপরিবর্তে ব্যবহার করুন fs.statSync)
সাইমন জাইক্স

3
এই বিভ্রান্তির কারণ কী হতে পারে তা হ'ল fs.unlink ফাইলগুলি মুছে ফেলে তবে fs.link লিঙ্কটি অনুলিপি করে না।
সাইমন জাইক্স

3
@ সিমনসিয়োক: ঠিক আছে .. আইটি linkingঅনুলিপি করছে না .. সমস্যাটি হল আপনি যখন লিঙ্কযুক্ত ফাইলের বিষয়বস্তুটি পরিবর্তন করবেন তখন মূল ফাইলটিও পরিবর্তন হবে।
আবডেন্নুর TOUMI

30

fs-extraযখন আমার জন্য কাজ করেছে ncpএবং wrenchসংক্ষিপ্ত হয়ে পড়ে:

https://www.npmjs.com/package/fs-extra


3
অতিরিক্ত হিসাবে তিনি বিকাশকারী wrenchব্যবহারকারীদের ব্যবহারের নির্দেশ দেয় fs-extraকারণ তিনি তার লাইব্রেরিটি অবমাননিত করেছেন।
mozillalives

22

লিনাক্স / ইউনিক্স ওএসের জন্য, আপনি শেল সিনট্যাক্স ব্যবহার করতে পারেন

const shell = require('child_process').execSync ; 

const src= `/path/src`;
const dist= `/path/dist`;

shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);

এটাই!


1
আপনাকে স্বাগতম
👋

1
এটি সহজ সমাধান। ইউনিক্স সরঞ্জামগুলি পুনরায় উদ্ভাবনের দরকার নেই!
মাইকেল ফ্রানজল

11
ওএসএক্স / লিনাক্স / Windows এ nodejs রান থেকে এই মাত্র 2 সব 3. জন্য উত্তর
mjwrazor

2
আপনি যদি উইন্ডোজ সার্ভারে চালিয়ে যাচ্ছেন তবে অ্যাবডেননর ট্যুমি কি করবেন?
mjwrazor

3
এটা কেন আমি দ্বারা উত্তর শুরু "-এর লিনাক্সের জন্য / ইউনিক্স অপারেটিং সিস্টেম, আপনি শেল সিনট্যাক্স ব্যবহার করতে পারেন .." 👍🏼
Abdennour TOUMI

19

fs- অতিরিক্ত মডিউল একটি কবজ মত কাজ করে।

এফএস-অতিরিক্ত ইনস্টল করুন

$ npm install fs-extra

উত্স ডিরেক্টরিটি গন্তব্য ডিরেক্টরিতে অনুলিপি করার প্রোগ্রামটি নীচে রয়েছে।

// include fs-extra package
var fs = require("fs-extra");

var source = 'folderA'
var destination = 'folderB'

// copy source folder to destination
fs.copy(source, destination, function (err) {
    if (err){
        console.log('An error occured while copying the folder.')
        return console.error(err)
    }
    console.log('Copy completed!')
});

তথ্যসূত্র

fs-extra: https://www.npmjs.com/package/fs-extra

উদাহরণ: নোডজেএস টিউটোরিয়াল - নোড.জেএস একটি ফোল্ডার অনুলিপি করুন


এই প্রক্রিয়াটি ডিরেক্টরিটি প্রতিস্থাপন করে বা এর সাথে একীভূত হয়?
এস এম শাহিনুল ইসলাম

14

এটি আমি ব্যক্তিগতভাবে এটি করব:

function copyFolderSync(from, to) {
    fs.mkdirSync(to);
    fs.readdirSync(from).forEach(element => {
        if (fs.lstatSync(path.join(from, element)).isFile()) {
            fs.copyFileSync(path.join(from, element), path.join(to, element));
        } else {
            copyFolderSync(path.join(from, element), path.join(to, element));
        }
    });
}

ফোল্ডার এবং ফাইলের জন্য কাজ করে


3
এই দ্রবণটি নিবিড় এবং সোজা is এটি প্রায় আমি ঠিক কীভাবে করব তা আমার থেকে একটি +1 হবে। আপনার কোডটিতে মন্তব্য সহ আপনার উত্তরটি উন্নত করা উচিত এবং অন্যদের চেয়ে এই সমাধানটিকে কেন বেশি পছন্দ করা হয় এবং এতে কী কী অসুবিধা থাকতে পারে তা বর্ণনা করা উচিত। - এছাড়াও এটির জন্য প্রয়োজনীয় মডিউলগুলি আপডেট করুন। ("পথ", "এফএস")
অ্যান্ড্রু

ফোল্ডারটি শীর্ষে রয়েছে কিনা তা পরীক্ষা করুন ... প্রাণ বাঁচাতে হবে ;-) যদি (! fs.existsSync (থেকে)) fs.mkdirSync (থেকে);
টোবিয়াস

9

আমি একটি ক্ষুদ্র কার্যকারী উদাহরণ তৈরি করেছি যা কেবলমাত্র কয়েকটি ধাপে অন্য গন্তব্য ফোল্ডারে একটি উত্স ফোল্ডার অনুলিপি করে (এনসিপি ব্যবহার করে @ shift66 উত্তরের উপর ভিত্তি করে):

পদক্ষেপ 1 - এনসিপি মডিউল ইনস্টল করুন:

npm install ncp --save

পদক্ষেপ 2 - copy.js তৈরি করুন (srcPath এবং ডাস্টপথ ওয়ার্সগুলি আপনার যা যা প্রয়োজন তা পরিবর্তন করুন):

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

7

নোড 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এটির কোন অস্তিত্ব নেই।


3
আমরা এই নোডের 8.x ব্যবহার দ্বারা কাজ পেতে পারেন require('util').promisifyসঙ্গে fs.mkdirএবং fs.copyFileপরিবর্তে require('fs').promises, যা এখনও v11.1 এ পরীক্ষামূলক।
সান ট্রেন-এনগুইন

@ সানট্রান কি 8.x এর withFileTypesবিকল্প আছে? কারণ এটি আপনাকে একটি statকল সঞ্চয় করে
এমপেন করুন

দুর্ভাগ্যক্রমে, 8.x এর withFileTypesবিকল্প নেই।
সান ট্রান-এনগুইন

@ সানট্রান-এনগুইন 8.x 31 ডিসেম্বর, 2019 এ জীবনের শেষ প্রান্তে পৌঁছেছে - আপগ্রেড করার সময় হতে পারে :-)
এমপেন

6

আমি ইতিমধ্যে এখানে অনেক উত্তর জানি কিন্তু কেউ সহজ উত্তর দেয় না। Fs-exra অফিসিয়াল ডকুমেন্টেশন সম্পর্কিত , আপনি এটি খুব সহজ করতে পারেন

const fs = require('fs-extra')

// copy file
fs.copySync('/tmp/myfile', '/tmp/mynewfile')

// copy directory, even if it has subdirectories or files
fs.copySync('/tmp/mydir', '/tmp/mynewdir')

পুনরাবৃত্তি বিকল্প সেট করতে নিশ্চিত করুন। fs.copySync ('/ tmp / mydir', '/ tmp / mynewdir', {recursive: true})
ধীররাজ কুমার

আপনি উল্লিখিত গিথুব ডক{ recursive: true } থেকে বিকল্প খুঁজে পাচ্ছি না , জানেন না এটি কাজ করে।
ফ্রেডি ড্যানিয়েল

আমি অনুমান করি আমরা এফএস-এক্সট্রা সম্পর্কে কথা বলছি তবে আপনার গিথুব লিঙ্কটি নোড-এফএস-এক্সট্রাতে নির্দেশ করে। বিভিন্ন গ্রন্থাগার হতে পারে?
ধীররাজ কুমার

@ ধীরাজকুমার, এটি গিথুবে নোড-এফএস-অতিরিক্ত দেখায় তবে এনপিএম -এ এফএস-অতিরিক্ত দেখায় । আমি জানি না উভয়ই সমান, দয়া করে এনপিএম
ফ্রেডি ড্যানিয়েল

Fs- অতিরিক্ত fs প্রতিস্থাপন করে?
ম্যাট

4

যেহেতু আমি কেবল একটি সাধারণ নোড স্ক্রিপ্ট তৈরি করছি, আমি চাইনি যে স্ক্রিপ্টের ব্যবহারকারীদের একগুচ্ছ বাহ্যিক মডিউল এবং নির্ভরতা আমদানি করা উচিত, তাই আমি আমার চিন্তাভাবনা ক্যাপটি রেখেছিলাম এবং ব্যাশ থেকে কমান্ডগুলি চালানোর জন্য অনুসন্ধান করেছি did শেল।

এই নোড.জেএস কোড স্নিপেট পুনরাবৃত্তভাবে বিল্ড নামে একটি ফোল্ডারে নোড-ওয়েবকিট.এপ নামে একটি ফোল্ডার অনুলিপি করে:

   child = exec("cp -r node-webkit.app build", function(error, stdout, stderr) {
        sys.print("stdout: " + stdout);
        sys.print("stderr: " + stderr);
        if(error !== null) {
            console.log("exec error: " + error);
        } else {

        }
    });

আমাকে শুরু করার জন্য জোন এ ল্যান্স পোলার্ডকে ধন্যবাদ ।

উপরের স্নিপেটটি ম্যাক ওএস এবং লিনাক্সের মতো ইউনিক্স ভিত্তিক প্ল্যাটফর্মগুলিতে সীমাবদ্ধ তবে উইন্ডোজের জন্যও একই জাতীয় কৌশল কাজ করতে পারে।


4

@ মল্লিকার্জুন-এম আপনাকে ধন্যবাদ!

fs-extra কাজটি করেছে এবং আপনি কলব্যাক সরবরাহ না করলে এটি প্রতিশ্রুতিও ফিরিয়ে দিতে পারে ! :)

const path = require('path')
const fs = require('fs-extra')

let source = path.resolve( __dirname, 'folderA')
let destination = path.resolve( __dirname, 'folderB')

fs.copy(source, destination)
  .then(() => console.log('Copy completed!'))
  .catch( err => {
    console.log('An error occured while copying the folder.')
    return console.error(err)
  })

2

সঙ্গে এক সিম্বলিক লিঙ্ক সমর্থন যদি ডিরেক্টরি উপস্থিত রয়েছে + + নিক্ষেপ করে না।

function copyFolderSync(from, to) {
  try {
    fs.mkdirSync(to);
  } catch(e) {}

  fs.readdirSync(from).forEach((element) => {
    const stat = fs.lstatSync(path.join(from, element));
    if (stat.isFile()) {
      fs.copyFileSync(path.join(from, element), path.join(to, element));
    } else if (stat.isSymbolicLink()) {
      fs.symlinkSync(fs.readlinkSync(path.join(from, element)), path.join(to, element));
    } else if (stat.isDirectory()) {
      copyFolderSync(path.join(from, element), path.join(to, element));
    }
  });
}

1

এই কোডটি ঠিকঠাকভাবে কাজ করবে, যেকোনও স্থানে পুনরাবৃত্তভাবে কোনও ফোল্ডার অনুলিপি করে। উইন্ডোজ শুধুমাত্র।

var child=require("child_process");
function copySync(from,to){
    from=from.replace(/\//gim,"\\");
    to=to.replace(/\//gim,"\\");
    child.exec("xcopy /y /q \""+from+"\\*\" \""+to+"\\\"");
}

নতুন প্লেয়ার তৈরি করার জন্য আমার টেক্সট-ভিত্তিক গেমটির জন্য পুরোপুরি কাজ করে।


1

আমি এফএস-অতিরিক্ত এবং অনুলিপি-ফোল্ডার-অনুলিপি করার জন্য কপি-ডির চেষ্টা করেছি। তবে আমি এটি চাই

  1. সাধারণত কাজ করে (অনুলিপিযোগ্য ত্রুটি নকল-ডির ছুঁড়ে ফেলে)
  2. ফিল্টারে দুটি আর্গুমেন্ট সরবরাহ করে: ফাইলপথ এবং ফাইল টাইপ (এফএস-এক্সট্রা ফাইল টাইপ না বলে)
  3. ডায়ার টু সাবডির চেক এবং ডায়ার টু ফাইল চেক রয়েছে

তাই আমি আমার নিজের লিখেছি:

//node module for node 8.6+
var path=require("path");
var fs=require("fs");

function copyDirSync(src,dest,options){
  var srcPath=path.resolve(src);
  var destPath=path.resolve(dest);
  if(path.relative(srcPath,destPath).charAt(0)!=".")
    throw new Error("dest path must be out of src path");
  var settings=Object.assign(Object.create(copyDirSync.options),options);
  copyDirSync0(srcPath,destPath,settings);
  function copyDirSync0(srcPath,destPath,settings){
    var files=fs.readdirSync(srcPath);
    if (!fs.existsSync(destPath)) {
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      if(settings.overwrite)
        throw new Error(`Cannot overwrite non-directory '${destPath}' with directory '${srcPath}'.`);
      return;
    }
    files.forEach(function(filename){
      var childSrcPath=path.join(srcPath,filename);
      var childDestPath=path.join(destPath,filename);
      var type=fs.lstatSync(childSrcPath).isDirectory()?"directory":"file";
      if(!settings.filter(childSrcPath,type))
        return;
      if (type=="directory") {
        copyDirSync0(childSrcPath,childDestPath,settings);
      } else {
        fs.copyFileSync(childSrcPath, childDestPath, settings.overwrite?0:fs.constants.COPYFILE_EXCL);
        if(!settings.preserveFileDate)
          fs.futimesSync(childDestPath,Date.now(),Date.now());
      }
    });
  }
}
copyDirSync.options={
  overwrite: true,
  preserveFileDate: true,
  filter: function(filepath,type){return true;}
};

এবং একটি অনুরূপ ফাংশন mkdirs, যা mkdirp এর বিকল্প

function mkdirsSync(dest) {
  var destPath=path.resolve(dest);
  mkdirsSync0(destPath);
  function mkdirsSync0(destPath){
    var parentPath=path.dirname(destPath);
    if(parentPath==destPath)
      throw new Error(`cannot mkdir ${destPath}, invalid root`);
    if (!fs.existsSync(destPath)) {
      mkdirsSync0(parentPath);
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      throw new Error(`cannot mkdir ${destPath}, a file already exists there`);
    }
  }
}

0

আমি এই ফাংশনটি অনুলিপি (কপিরএফিলসাইঙ্ক) বা মুভিং (পুনর্নামসংযোগ) উভয়ের জন্য ডিরেক্টরিগুলির মধ্যে পুনরাবৃত্তভাবে লিখেছি:

//copy files
copyDirectoryRecursiveSync(sourceDir, targetDir);
//move files
copyDirectoryRecursiveSync(sourceDir, targetDir, true);


function copyDirectoryRecursiveSync(source, target, move) {
if (!fs.lstatSync(source).isDirectory()) return;

var operation = move ? fs.renameSync : fs.copyFileSync;
fs.readdirSync(source).forEach(function (itemName) {
    var sourcePath = path.join(source, itemName);
    var targetPath = path.join(target, itemName);

    if (fs.lstatSync(sourcePath).isDirectory()) {
        fs.mkdirSync(targetPath);
        copyDirectoryRecursiveSync(sourcePath, targetDir);
    }
    else {
        operation(sourcePath, targetPath);
    }
});}

0

আপনি যদি লিনাক্সে থাকেন এবং পারফরম্যান্স কোনও সমস্যা না হয় তবে আপনি ব্যাশ কমান্ডটি কার্যকর করতে মডিউল execথেকে ফাংশনটি ব্যবহার করতে পারেন child_process:

const { exec } = require('child_process');
exec('cp -r source dest', (error, stdout, stderr) => {...});

কিছু ক্ষেত্রে, আমি একটি সম্পূর্ণ মডিউল ডাউনলোড করা এমনকি fsমডিউল ব্যবহারের চেয়েও এই সমাধানটিকে আরও পরিষ্কার পেয়েছি ।


0

এনসিপি ফাইল ডেস্ক্রিপ্টরটিকে লক করে এবং কলব্যাক ফায়ার করে যখন এটি এখনও আনলক করা হয়নি। আমি পরিবর্তে পুনরাবৃত্ত-অনুলিপি মডিউল ব্যবহার করার পরামর্শ দিই । এটি ইভেন্টগুলিকে সমর্থন করে এবং অনুলিপিটি শেষ হওয়ার বিষয়ে আপনি নিশ্চিত থাকতে পারেন।


0

আপনার প্যাকেজটি বাছাই করার সময় সাবধানতা অবলম্বন করুন। কিছু প্যাকেজ যেমন কপিরাইট-ডির 0x1fffffe8 অক্ষরের বেশি লম্বা ফাইলের অনুলিপি সমর্থন করে না। এটি এর মতো কিছু ত্রুটি ছুঁড়ে দেবে:

buffer.js:630 Uncaught Error: Cannot create a string longer than 0x1fffffe8 characters 

আমি আমার একটি প্রকল্পে এরকম কিছু অভিজ্ঞতা পেয়েছি। শেষ পর্যন্ত, আমি যে প্যাকেজটি ব্যবহার করছি সেগুলি পরিবর্তন করতে হয়েছিল এবং প্রচুর কোড সামঞ্জস্য করতে হয়েছিল। আমি বলব যে এটি খুব মনোরম অভিজ্ঞতা নয়।

যদি একাধিক উত্স এবং একাধিক গন্তব্য অনুলিপি পছন্দসই হয়, আপনি আরও ভাল-অনুলিপি ব্যবহার করতে পারেন এবং এর মতো কিছু লিখতে পারেন:

// copy from multiple source into a directory
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], '/path/to/destination/folder');

অথবা এমনকি :

// copy from multiple source into multiple destination
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], ['/path/to/destination/folder', '/path/to/another/folder']);

-1

হ্যাঁ, ncpহয় coolযদিও ...

আপনি চাইলে / করতে চাইলে এর ক্রিয়াকলাপটি প্রচার করা উচিত super cool। যেহেতু আপনি এটি এ toolsএসেছেন তাই এটি পুনরায় ব্যবহার করার জন্য এটি একটি ফাইলে যুক্ত করুন ।

নীচে একটি কাজ সংস্করণ যা হয় Asyncএবং ব্যবহার Promises


index.js

const {copyFolder} = require('./tools/');

return copyFolder(
    yourSourcePath,
    yourDestinationPath
)
.then(() => {
    console.log('-> Backup completed.')
}) .catch((err) => {
    console.log("-> [ERR] Could not copy the folder: ", err);
})

tools.js

const ncp = require("ncp");

/**
 * Promise Version of ncp.ncp()
 * 
 * This function promisifies ncp.ncp().
 * We take the asynchronous function ncp.ncp() with 
 * callback semantics and derive from it a new function with
 * promise semantics.
 */
ncp.ncpAsync = function (sourcePath, destinationPath) {
  return new Promise(function (resolve, reject) {
      try {
          ncp.ncp(sourcePath, destinationPath, function(err){
              if (err) reject(err); else resolve();
          });
      } catch (err) {
          reject(err);
      }
  });
};

/**
 * Utility function to copy folders asynchronously using
 * the Promise returned by ncp.ncp(). 
 */
const copyFolder = (sourcePath, destinationPath) => {
    return ncp.ncpAsync(sourcePath, destinationPath, function (err) {
        if (err) {
            return console.error(err);
        }
    });
}
module.exports.copyFolder = copyFolder;

-1

এই সমস্যার সহজতম উপায় হল কেবল 'fs' এবং 'पथ' মডিউল এবং কিছু যুক্তি ব্যবহার করা .....

নতুন ফোল্ডারের সমস্ত ফাইল নতুন নামের সাথে অনুলিপি করে যদি আপনি কেবল সংস্করণ নম্বর সেট করতে চান তবে ....................... "var v = 'আপনার ডিরেক্টরি নাম ' "

ফাইলের নাম উপসর্গ ভি কন্টেন্ট ফাইল নামের সাথে যুক্ত করা হয়।

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

var c = 0;
var i =0 ;
var v = "1.0.2";
var copyCounter = 0;
var directoryCounter = 0; 
var directoryMakerCounter = 0;
var recursionCounter = -1;
var Flag = false;
var directoryPath = [] ;
var directoryName = [] ;
var directoryFileName = [];
var fileName;
var directoryNameStorer;
var dc = 0;
var route ;



if (!fs.existsSync(v)){
   fs.mkdirSync(v);
}

var basePath = path.join(__dirname, v);


function walk(dir){

  fs.readdir(dir, function(err, items) {

    items.forEach(function(file){

        file = path.resolve(dir, file);

        fs.stat(file, function(err, stat){
            if(stat && stat.isDirectory()){

                directoryNameStorer = path.basename(file);
                route = file;
                route = route.replace("gd",v);

                directoryFileName[directoryCounter] = route;
                directoryPath[directoryCounter] = file;
                directoryName[directoryCounter] = directoryNameStorer;

                directoryCounter++;
                dc++;

                if (!fs.existsSync(basePath+"/"+directoryName[directoryMakerCounter])){
                    fs.mkdirSync(directoryFileName[directoryMakerCounter]);
                    directoryMakerCounter++;
                }

            }else{

                    fileName = path.basename(file);
                    if(recursionCounter >= 0){
                        fs.copyFileSync(file, directoryFileName[recursionCounter]+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;
                    }else{
                        fs.copyFileSync(file, v+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;    
                    }

                }
                if(copyCounter + dc == items.length && directoryCounter > 0 && recursionCounter < directoryMakerCounter-1){
                    console.log("COPY COUNTER :             "+copyCounter);
                    console.log("DC COUNTER :               "+dc);                        
                    recursionCounter++;
                    dc = 0;
                    copyCounter = 0;
                    console.log("ITEM DOT LENGTH :          "+items.length);
                    console.log("RECURSION COUNTER :        "+recursionCounter);
                    console.log("DIRECOTRY MAKER COUNTER :  "+directoryMakerCounter);
                    console.log(": START RECURSION :        "+directoryPath[recursionCounter]);
                    walk(directoryPath[recursionCounter]); //recursive call to copy sub-folder

                }

        })
    })
 });

}
 walk('./gd', function(err, data){ //Just Pass The Root Directory Which You Want to Copy
 if(err) throw err;
 console.log("done");
})

-1

আমি এইভাবে করেছি:

let fs = require('fs');
let path = require('path');

তারপর:

let filePath = //your FilePath

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.