নোড.জেজে ফাইল অনুলিপি করার দ্রুততম উপায়


488

আমি যে প্রকল্পে কাজ করছি (নোড.জেএস) ফাইল সিস্টেমের সাথে প্রচুর ক্রিয়াকলাপ বোঝায় (অনুলিপি / পঠন / লিখন ইত্যাদি)। আমি কোন পদ্ধতিগুলি দ্রুততম তা জানতে চাই এবং আমি একটি পরামর্শ পেয়ে খুশি হব। ধন্যবাদ।


42
এটি একটি ভাল প্রশ্ন, যদিও এটি আকর্ষণীয় যে এটি 25 টি উর্ধ্বতন পেয়ে যায় যখন অন্যান্য অনুরূপ বিন্যাসের প্রশ্নগুলি 3 "মান" পূরণ না করার জন্য অবিলম্বে 3 বা 4 ডাউনভোট পাবে (সম্ভবত জাভাস্ক্রিপ্ট ট্যাগটি दयालु লোকেরা ক্রল করেছে :)
বেন

22
বেশিরভাগ ক্ষেত্রে আমরা ব্রাউজারগুলিকে সাধারণীকরণের কয়েক বছর পরে এই পুরো "ফাইল" ব্যবসায় সম্পর্কে সতেজ নতুন এবং উচ্ছ্বসিত।
এরিক রিপেন

3
পৃষ্ঠাতে শুধুমাত্র সঠিক উত্তর হল এই এক । অন্য উত্তরের কোনওটিই আসলে ফাইলগুলি অনুলিপি করে না। MacOS এবং Windows এ থাকা ফাইলগুলিতে অন্যান্য মেটাডেটা থাকে যা কেবলমাত্র বাইটগুলি অনুলিপি করে হারিয়ে যায়। এই পৃষ্ঠায়, উইন্ডো এবং ম্যাকোসের অন্য কোনও উত্তর দ্বারা অনুলিপি করা হয়নি এমন তথ্যের উদাহরণ । এমনকি ইউনিক্সে অন্যান্য উত্তরগুলিও তৈরির তারিখ অনুলিপি করে না, এমন একটি বিষয় যা ফাইল অনুলিপি করার সময় প্রায়শই গুরুত্বপূর্ণ।
gman

উত্তর:


717

স্ট্রিম ব্যবহার করে কোডের এক লাইনে একটি ফাইল অনুলিপি করার এটি একটি ভাল উপায়:

var fs = require('fs');

fs.createReadStream('test.log').pipe(fs.createWriteStream('newLog.log'));

নোড v8.5.0 এ, copyFile যুক্ত করা হয়েছিল

const fs = require('fs');

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

64
কেবল মনে রাখবেন যে বাস্তব জীবনে আপনি দুটি createReadStreamএবং createWriteStreamত্রুটি উভয়ই পরীক্ষা করতে চান , যাতে আপনি একটি ওয়ান-লাইনার পাবেন না (যদিও এটি এখনও ঠিক তত দ্রুত হবে)।
ইবোহলমান

18
এটি কাঁচা cp test.log newLog.logমাধ্যমে কার্যকর করার চেয়ে কত গতি / ধীর require('child_process').exec?
ল্যান্স পোলার্ড

41
copyউইন্ডোতে পুরো নোড.জেএস সমাধানের বিপরীতে ওয়েল পোর্টেবল নয়।
জিন

12
দুর্ভাগ্যক্রমে আমার সিস্টেমে স্ট্রিম ব্যবহার করা তুলনায় অত্যন্ত ধীর child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
রবার্ট

12
আমি এই পদ্ধতিটি ব্যবহার করেছি এবং আমার যা কিছু পেয়েছিল তা হ'ল লেখার ফাঁকা ফাইল। কোন ধারণা কেন? fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
টিমমার্জ

293

একই প্রক্রিয়া, কিন্তু এটি ত্রুটি পরিচালনার যোগ করে:

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

5
এটি লক্ষনীয় যে সিবি কলড পতাকা প্রয়োজন কারণ পাইপ ত্রুটিগুলি দুটি স্ট্রমে ত্রুটি ঘটায়। উত্স এবং গন্তব্য প্রবাহ।
গ্যাস্টন সানচেজ

4
উত্স ফাইলটি উপস্থিত না থাকলে আপনি কীভাবে ত্রুটিটি পরিচালনা করবেন? গন্তব্য ফাইল এখনও সেক্ষেত্রে তৈরি হয়।
মিশেল হুয়া

1
আমি মনে করি WriteStreamউইলের কোনও ত্রুটি কেবল এটিই আনপাইপ করবে। rd.destroy()নিজেকে ফোন করতে হবে । কমপক্ষে আমার ক্ষেত্রে এটিই ঘটেছে। দুঃখের বিষয় সোর্স কোড ব্যতীত খুব বেশি ডকুমেন্টেশন নেই।
রবার্ট

কী cbদাঁড়ায়? তৃতীয় যুক্তি হিসাবে আমাদের কী পাস করা উচিত?
সায়ানগার্ল

4
@ সাইয়ানগার্ল 'সিবি' এর অর্থ "কলব্যাক"। আপনি একটি ফাংশনে পাস করা উচিত।
ব্রায়ান জে মিলার

143

আমি createReadStream/createWriteStreamকোনও কারণে পদ্ধতিটি কাজ করতে সক্ষম হইনি , তবে fs-extraএনপিএম মডিউলটি এটি এখনই ব্যবহার করে worked যদিও পারফরম্যান্সের পার্থক্য সম্পর্কে আমি নিশ্চিত নই।

FS-অতিরিক্ত

npm install --save fs-extra

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

fs.copySync(path.resolve(__dirname,'./init/xxx.json'), 'xxx.json');

3
এটি এখন সেরা বিকল্প
জয়ন রিজভী

11
নোডে সিঙ্ক্রোনাস কোড ব্যবহার করা আপনার অ্যাপ্লিকেশন কর্মক্ষমতাটিকে মেরে ফেলে।
mvillar

3
ওহ দয়া করে ... প্রশ্নটি কোনও ফাইল অনুলিপি করার দ্রুততম পদ্ধতি সম্পর্কে । যদিও দ্রুততম সর্বদা সাবজেক্টিভ হয়, আমি মনে করি না কোডের একটি সুসংগত পিসের কোনও ব্যবসা আছে।
সংপাথ্রিসিস

24
কার্যকর করার জন্য দ্রুততম বা কার্যকর করা সবচেয়ে দ্রুত? ভিন্ন ভিন্ন অগ্রাধিকার অর্থ এটি একটি বৈধ উত্তর।
প্যাট্রিক গাউনসন

14
fs-extra এরও fs.copy(src, dst, callback);অ্যাসিনক্রোনাস পদ্ধতি রয়েছে , এবং এগুলি @ এমওয়িলারের উদ্বেগ সমাধান করবে।
মার্ক ডুরডিন

134

নোড.জেস 8.5.0 থেকে আমাদের কাছে নতুন fs.copyFile এবং fs.copyFileSync পদ্ধতি রয়েছে।

ব্যবহারের উদাহরণ:

var fs = require('fs');

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

2
এই পৃষ্ঠায় একমাত্র সঠিক উত্তর। অন্য উত্তরের কোনওটিই আসলে ফাইলগুলি অনুলিপি করে না। MacOS এবং Windows এ থাকা ফাইলগুলিতে অন্যান্য মেটাডেটা থাকে যা কেবলমাত্র বাইটগুলি অনুলিপি করে হারিয়ে যায়। এই পৃষ্ঠায়, উইন্ডো এবং ম্যাকোসের অন্য কোনও উত্তর দ্বারা অনুলিপি করা হয়নি এমন তথ্যের উদাহরণ । এমনকি ইউনিক্সে অন্য উত্তরগুলি তৈরির তারিখটি অনুলিপি করে না, এমন একটি বিষয় যা ফাইল অনুলিপি করার সময় প্রায়শই গুরুত্বপূর্ণ।
gman

ভালভাবে দুঃখের সাথে ম্যাকের সবকিছু অনুলিপি করতে ব্যর্থ। আশা করি তারা এটিকে ঠিক করবেন: github.com/nodejs/node/issues/30575
gman

বিটিডাব্লু মনে রাখবেন যে copyFile()দীর্ঘ ফাইলগুলি ওভাররাইট করার সময় বাগড হয়েছে। uv_fs_copyfile()নোড ভি 8.7.0 অবধি সৌজন্যে (1.15.0 লিবিভ)। দেখতে github.com/libuv/libuv/pull/1552
আন্তন Rudeshko

74

প্রতিশ্রুতি এবং ত্রুটি পরিচালনার সাথে লিখিতভাবে দ্রুত এবং ব্যবহারে সুবিধাজনক।

function copyFile(source, target) {
  var rd = fs.createReadStream(source);
  var wr = fs.createWriteStream(target);
  return new Promise(function(resolve, reject) {
    rd.on('error', reject);
    wr.on('error', reject);
    wr.on('finish', resolve);
    rd.pipe(wr);
  }).catch(function(error) {
    rd.destroy();
    wr.end();
    throw error;
  });
}

অ্যাসিঙ্ক / সিনট্যাক্সের অপেক্ষার সাথে একই:

async function copyFile(source, target) {
  var rd = fs.createReadStream(source);
  var wr = fs.createWriteStream(target);
  try {
    return await new Promise(function(resolve, reject) {
      rd.on('error', reject);
      wr.on('error', reject);
      wr.on('finish', resolve);
      rd.pipe(wr);
    });
  } catch (error) {
    rd.destroy();
    wr.end();
    throw error;
  }
}

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

প্রতিলিপিটি কপির সফল হলে সমাধান হয়ে যায়। যদি এটি প্রত্যাখ্যান করা হয় তবে এর রাজ্য নিষ্পত্তি হবে এবং একাধিকবার বাতিল প্রত্যাখ্যান করা কল্পনা করলে কোনও লাভ হবে না।
benweet

2
আমি শুধু পরীক্ষিত new Promise(function(resolve, reject) { resolve(1); resolve(2); reject(3); reject(4); console.log("DONE"); }).then(console.log.bind(console), function(e){console.log("E", e);});এবং তাকিয়ে বৈশিষ্ট এই এবং আপনি সঠিক আছেন: সমাধানের চেষ্টা করা বা প্রত্যাখ্যান একটি সমাধান প্রতিশ্রুতি কোনো প্রভাব নেই। সম্ভবত আপনি নিজের উত্তরটি প্রসারিত করতে এবং ব্যাখ্যা করতে পারেন যে আপনি কেন এই পদ্ধতিতে ফাংশনটি লিখেছেন? ধন্যবাদ :-)
লেকেনস্টেইন

2
যাইহোক, লিখিত স্ট্রিমগুলির জন্য closeহওয়া উচিত finish
লেকেনস্টেইন

এবং যদি আপনি আশ্চর্য হন যে পাইপ ত্রুটির পরেও কেন আপনার অ্যাপ্লিকেশনটি কখনই বন্ধ হয় না /dev/stdin, এটি একটি বাগ github.com/joyent/node/issues/25375
লেকেনস্টেইন

43

ভাল, সাধারণত অ্যাসিক্রোনাস ফাইল অপারেশন এড়ানো ভাল। এখানে সংক্ষিপ্ত (উদাহরণস্বরূপ কোনও ত্রুটি পরিচালনা করা নয়) সিঙ্ক উদাহরণ:

var fs = require('fs');
fs.writeFileSync(targetFile, fs.readFileSync(sourceFile));

8
বলতে গেলে সাধারণভাবে এটি অত্যন্ত মিথ্যা, বিশেষত যেহেতু এটি তাদের সার্ভারে করা প্রতিটি অনুরোধের জন্য ফাইলগুলিকে পুনরায় স্লাপ করে ping এটি ব্যয়বহুল হতে পারে।
অনুঘটক

8
*Syncপদ্ধতিগুলি ব্যবহার করা সম্পূর্ণ নোডেজের ফিলোসফির বিরুদ্ধে! এগুলিও ধীরে ধীরে হতাশায় পরিণত হচ্ছে বলে আমি মনে করি। নোডেজের পুরো ধারণাটি হ'ল এটি একক থ্রেডেড এবং ইভেন্ট-চালিত।
গিলিব 21

11
@ গিলিব কেবলমাত্র সেগুলি ব্যবহারের জন্য আমি ভাবতে পারি তার কারণটি হ'ল সরলতার জন্য - আপনি যদি একটি দ্রুত স্ক্রিপ্ট লিখে থাকেন যা আপনি কেবল একবার ব্যবহার করবেন তবে আপনি সম্ভবত প্রক্রিয়াটি ব্লক করার বিষয়ে উদ্বিগ্ন হয়ে উঠবেন না।
তারাবিআমরিনবোলাবস

13
আমি তাদের অবহেলা করা সম্পর্কে সচেতন নই। সিঙ্ক পদ্ধতিগুলি প্রায়শই ওয়েব সার্ভারে একটি ভয়ংকর ধারণা তবে নোড-ওয়েবকিটের মতো কিছু ক্ষেত্রে আদর্শ যেখানে ফাইলগুলি অনুলিপি করার সময় এটি কেবল উইন্ডোটিতে অ্যাকশন লক করে রাখে। একটি লোডিং জিআইএফ এবং সম্ভবত একটি লোড বার ছুঁড়ে যা নির্দিষ্ট পয়েন্টগুলিতে আপডেট হয় এবং সিঙ্ক পদ্ধতিগুলি অনুলিপিটি শেষ না হওয়া পর্যন্ত সমস্ত ক্রিয়াকে অবরুদ্ধ করে দেয়। এটি কখনই এবং কোথায় তাদের জায়গার জিনিস হিসাবে এটি কোনও সর্বোত্তম অনুশীলনের জিনিস নয়।
এরিক রিপেন

6
আপনি যখন অন্য কোনও সিঙ্ক ক্রিয়াকলাপের সাথে ইন্টারঅ্যাক্ট করছেন বা সিক্যুয়াল ক্রিয়াকলাপটি করতে চান আপনি কী চান তা সিঙ্ক পদ্ধতিগুলি ঠিক আছে (যেমন আপনি যে কোনও উপায়ে সিঙ্ককে অনুকরণ করছেন)। যদি ক্রিয়াকলাপগুলি ক্রমিক হয় তবে কেবল কলব্যাক হেল (এবং / অথবা প্রতিশ্রুতি স্যুপ) এড়িয়ে চলুন এবং সিঙ্ক পদ্ধতিটি ব্যবহার করুন। সাধারণভাবে এগুলি সার্ভারগুলিতে সাবধানতার সাথে ব্যবহার করা উচিত তবে বেশিরভাগ ক্ষেত্রে সিএলআই স্ক্রিপ্টগুলির সাথে জড়িত for
srcspider

18

ত্রুটি ইভেন্ট হ্যান্ডলারের শর্ট-কাট দিয়ে ত্রুটি পরিচালনা করার সাথে মাইক শিলিংয়ের সমাধান।

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

18

যদি আপনি এটি অ্যাসিঙ্ক হওয়ার বিষয়ে চিন্তা করেন না এবং গিগাবাটি আকারের ফাইলগুলি অনুলিপি করছেন না, এবং কেবল একটি একক ক্রিয়াকলাপের জন্য অন্য নির্ভরতা যুক্ত করবেন না:

function copySync(src, dest) {
  var data = fs.readFileSync(src);
  fs.writeFileSync(dest, data);
}

4
আমি এই উত্তর পছন্দ। পরিষ্কার এবং সহজ।
রব গ্লিসন

7
@ রবগ্লিজন, এবং ফাইলের সামগ্রীর মতোই মেমরির প্রয়োজন রয়েছে ... আমি সেখানে উপস্থিতদের গণনা দেখে অবাক হয়েছি।
কনস্টান্টিন

আমি একটি "যুক্ত করেছি এবং গিগাবাটি আকারের ফাইলগুলি" কভিয়েট করছি না।
অ্যান্ড্রু চাইল্ডস

fs.existsSyncকল বাদ দেওয়া হবে। fs.existsSyncকল এবং কলটির মধ্যে ফাইলটি অদৃশ্য হয়ে যেতে পারে fs.readFileSync, যার অর্থ fs.existsSyncকল আমাদের কোনও কিছু থেকে রক্ষা করে না।
qntm

উপরন্তু, ফিরে falseযদি fs.existsSyncব্যর্থ হয় সম্ভবত গরিব কর্মদক্ষতার কারণে কয়েক ভোক্তাদের হয় copySyncম্যানুয়ালি ফেরত মান প্রত্যেক সময় এটা বলা হচ্ছে, কোনো বেশি আমরা জন্য কি করতে পরিদর্শন করা মনে হবে fs.writeFileSync এট অল। । একটি ব্যতিক্রম নিক্ষেপ করা আসলে পছন্দসই।
কিএনটিএম

2
   const fs = require("fs");
   fs.copyFileSync("filepath1", "filepath2"); //fs.copyFileSync("file1.txt", "file2.txt");

আমি ব্যক্তিগতভাবে কোনও ফাইল অনুলিপি করতে এবং node.js ব্যবহার করে অন্য একটি ফাইল প্রতিস্থাপন করতে এটি ব্যবহার করি :)


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

@ জারেডস্মিথ ট্রু, তবে আমার গুগল অনুসন্ধান আমাকে এখানে নিয়ে যায় এবং আমি এটি চেয়েছিলাম।
কোডপ্লেব

1

দ্রুত অনুলিপিগুলির জন্য আপনার fs.constants.COPYFILE_FICLONEপতাকাটি ব্যবহার করা উচিত । এটি (ফাইল সিস্টেমগুলির পক্ষে এটি সমর্থন করে) প্রকৃতপক্ষে ফাইলটির বিষয়বস্তু অনুলিপি না করে। কেবলমাত্র একটি নতুন ফাইল এন্ট্রি তৈরি করা হয়েছে, তবে এটি উত্স ফাইলটির অনুলিপি-অন-লিখনের "ক্লোন" নির্দেশ করে।

কিছুই / কম না করা কিছু করার দ্রুততম উপায়;)

https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback

let fs = require("fs");

fs.copyFile(
  "source.txt",
  "destination.txt",
  fs.constants.COPYFILE_FICLONE,
  (err) => {
    if (err) {
      // TODO: handle error
      console.log("error");
    }
    console.log("success");
  }
);

পরিবর্তে প্রতিশ্রুতি ব্যবহার:

let fs = require("fs");
let util = require("util");
let copyFile = util.promisify(fs.copyFile);


copyFile(
  "source.txt",
  "destination.txt",
  fs.constants.COPYFILE_FICLONE
)
  .catch(() => console.log("error"))
  .then(() => console.log("success"));

fs.promises.copyFile
gman

0

নকল করার আগে বেনউইটের সমাধান ফাইলের দৃশ্যমানতা পরীক্ষা করে:

function copy(from, to) {
    return new Promise(function (resolve, reject) {
        fs.access(from, fs.F_OK, function (error) {
            if (error) {
                reject(error);
            } else {
                var inputStream = fs.createReadStream(from);
                var outputStream = fs.createWriteStream(to);

                function rejectCleanup(error) {
                    inputStream.destroy();
                    outputStream.end();
                    reject(error);
                }

                inputStream.on('error', rejectCleanup);
                outputStream.on('error', rejectCleanup);

                outputStream.on('finish', resolve);

                inputStream.pipe(outputStream);
            }
        });
    });
}

0

কেন অনুলিপি ফাংশনে নির্মিত নোডেজ ব্যবহার করবেন না?

এটি উভয়ই অ্যাসিঙ্ক এবং সিঙ্ক সংস্করণ সরবরাহ করে:

const fs = require('fs');

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

https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags


3
উত্সাহ দেওয়া হচ্ছে না কারণ এই উত্তরটি সদৃশ।
কিওয়ারটি

-1

মাইকের সমাধান , তবে প্রতিশ্রুতি সহ:

const FileSystem = require('fs');

exports.copyFile = function copyFile(source, target) {
    return new Promise((resolve,reject) => {
        const rd = FileSystem.createReadStream(source);
        rd.on('error', err => reject(err));
        const wr = FileSystem.createWriteStream(target);
        wr.on('error', err => reject(err));
        wr.on('close', () => resolve());
        rd.pipe(wr);
    });
};

@ রোয়ি কারণ আমি একটি অ্যাসিঙ্ক সমাধান চাই ...?
এমপিএন

-1

অন্য একটি উত্তর উন্নতি।

বৈশিষ্ট্য:

  • যদি ডিএসটি ফোল্ডারগুলি বিদ্যমান না থাকে তবে এটি স্বয়ংক্রিয়ভাবে এটি তৈরি করবে। অন্য উত্তরটি কেবল ত্রুটি ফেলবে।
  • এটি একটি প্রদান করে 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);
}

-2

উপরোক্ত সমস্ত সমাধান যা উত্স ফাইলের অস্তিত্ব পরীক্ষা করে না বিপজ্জনক ... উদাহরণস্বরূপ

fs.stat(source, function(err,stat) { if (err) { reject(err) }

অন্যথায় উত্স এবং টার্গেট কোনও ভুল প্রতিস্থাপনের ক্ষেত্রে একটি দৃশ্যে ঝুঁকি রয়েছে, কোনও ত্রুটি না দেখে আপনার ডেটা স্থায়ীভাবে হারিয়ে যাবে।


এটির একটি রেসের শর্তও রয়েছে: ফাইলটি স্ট্যাট-ইন করা এবং পড়া / লেখা / অনুলিপিের মধ্যে ধ্বংস করা যেতে পারে। কেবল অপারেশনটি চেষ্টা করা এবং যে কোনও ফলাফলের ত্রুটিটি মোকাবেলা করা সর্বদা ভাল।
জ্যারেড স্মিথ

লেখার ক্রিয়াকলাপের আগে লক্ষ্যটির অস্তিত্ব পরীক্ষা করা নিশ্চিত করে যে আপনি দুর্ঘটনার দ্বারা লক্ষ্যটি ওভাররাইট করবেন না উদাহরণস্বরূপ এমন একটি দৃশ্যের অন্তর্ভুক্ত যা গন্তব্য এবং উত্সটি ব্যবহারকারী দ্বারা ভুল দ্বারা সেট করা হয়েছে ... লেখার অপারেশন ব্যর্থ হওয়ার জন্য অপেক্ষা করতে দেরী হবে ... যিনি আমাকে দিয়েছেন (-1) দয়া করে আপনার প্রকল্পের ক্ষেত্রে এই ঘটনাটি ঘটে তার পরে আপনার র‌্যাঙ্কিং পর্যালোচনা করুন :-) পুনরায়। ঘোড়দৌড় - ভারী ট্রাফিক সাইটগুলিতে সর্বদা একটি প্রক্রিয়া পরিচালনা পরিচালনার জন্য সিঙ্কের আশ্বাসের প্রয়োজন হয় - হ্যাঁ এটি তখন পারফরম্যান্সের বাধা
অস্ট্রেলীয়

আমি ভুল করে বলেছিলাম না কারণ আমি ভুল করেছিলাম, কারণ আমি এই প্রশ্নটির উত্তর নেই। এটি বিদ্যমান উত্তরের উপর একটি সতর্কতামূলক মন্তব্য হওয়া উচিত।
জ্যারেড স্মিথ

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

আমি এটি পেয়েছি, কেউ নেতিবাচক প্রতিক্রিয়া পছন্দ করে না । তবে এটি কেবল একটি ডাউনভোট। আমি এটি দেওয়ার জন্য আমার যুক্তিতে দাঁড়িয়েছি, কারণ এটি ওপি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না এবং একটি মন্তব্য করার পক্ষে যথেষ্ট সংক্ষিপ্ত। আপনি এটি নিতে পারেন তবে আপনি নিতে পারেন, তবে আপনি যদি অনুপাতের বাইরে এই ধরণের জিনিসটি ফুটিয়ে তুলেন তবে আপনি স্ট্যাকের ওভারফ্লোটি খুব হতাশাব্যঞ্জক অভিজ্ঞতা হতে চলেছেন।
জেরেদ স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.