আমি কীভাবে ফাইলগুলি নোড.জেজে স্থানান্তর করব?


151

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

উত্তর:


157

সেপ্পো 10010 মন্তব্য অনুসারে, আমি এটি করতে পুনরায় নামকরণ ফাংশনটি ব্যবহার করেছি।

http://nodejs.org/docs/latest/api/fs.html#fs_fs_rename_oldpath_newpath_callback

fs.rename (ওল্ডপাথ, নিউপ্যাথ, কলব্যাক)

এতে যুক্ত হয়েছে: v0.0.2

oldPath <String> | <Buffer>
newPath <String> | <Buffer>
callback <Function>

অ্যাসিঙ্ক্রোনাস নামকরণ (2)। সম্ভাব্য ব্যতিক্রম ব্যতীত অন্য কোনও যুক্তি সম্পূর্ণ হওয়ার কলব্যাককে দেওয়া হয় না।


5
যারা @ seppo0010 এর মন্তব্য কোথায় গিয়েছিল তা নিয়ে ভাবছেন: এটি আমার উত্তর ছিল, যা আমি মুছে ফেলেছিলাম এবং ওপিতে একটি মন্তব্য হিসাবে পোস্ট করেছি।
ম্যাট বল

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

"হানি" এর তৃতীয় উত্তরের উদাহরণ কোড রয়েছে!
নাথন

47

এই উদাহরণ থেকে নেওয়া: কর্মে নোড.জেস

একটি মুভ () ফাংশন যা সম্ভব হলে পুনরায় নামকরণ করে, বা অনুলিপি করে ফিরে যায়

var fs = require('fs');

module.exports = function move(oldPath, newPath, callback) {

    fs.rename(oldPath, newPath, function (err) {
        if (err) {
            if (err.code === 'EXDEV') {
                copy();
            } else {
                callback(err);
            }
            return;
        }
        callback();
    });

    function copy() {
        var readStream = fs.createReadStream(oldPath);
        var writeStream = fs.createWriteStream(newPath);

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

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

        readStream.pipe(writeStream);
    }
}

3
কবজির মতো কাজ করেছেন। ধন্যবাদ! আমি যদি কিছুটা যুক্ত করতে পারি: পুরানোপথটি লিঙ্কমুক্ত হলে 'মুভ' আরও ভাল নাম হতে পারে।
জোকসটার

এই ক্ষেত্রে অনুলিপি () ফাংশনটি ঠিক আছে, তবে যদি কেউ এটি কোনও প্রতিশ্রুতিযুক্ত বস্তুর অভ্যন্তরে আবৃত করতে চান, তবে দয়া করে নীচে আমার "উত্তর" দেখুন বা লেখার স্ট্রিমের "বন্ধ" ইভেন্টের প্রতিশ্রুতিটি সমাধান করার জন্য মনে রাখবেন, পড়ার স্ট্রিমে নেই।
জেম

এটি এমন কোনও কিছুর মতো দেখায় যা আমার প্রয়োজনের জন্য কাজ করবে, তবে আমি জানি না কীভাবে মডিউল.এক্সপোর্টগুলি = ফাংশন {} স্টাইল ব্যবহার করতে হয়। আমি কি এই কোডটি আমার অ্যাপটিতে নিজেই অনুলিপি করি যেখানে আমার ইতিমধ্যে var fs = প্রয়োজনীয় ('fs') রয়েছে; এবং তারপরে fs.rename এর পরিবর্তে fs.move (oldFile, newFile, ফাংশন (ভুল) {....}) কল করবেন?
কৌতূহলী 101

@ কৌতূহলী 101 আপনি এটিকে ফাইলমোভ.জেএস এর মতো একটি ফাইলে রাখতে পারেন এবং এটির মতো ফাইল আমদানি = আমদানি করতে পারেন ('ফাইলমোভ'); তারপরে এটি ফাইলমোভের মতো ব্যবহার করুন (...);
তেওমান শিপাহি

ধন্যবাদ @ তেমনশিপাহী। সেক্ষেত্রে আমি mylibrary.js এ যুক্ত করতে এবং সেখান থেকে এটি ব্যবহার করতে পারি। আমি ভেবেছিলাম এটি প্রোটোটাইপ পদ্ধতি যুক্ত করার জন্য কিছু সুপরিচিত পদ্ধতি তাই এটি বস্তুটিতেই উপলব্ধ হয়ে যায়।
কৌতূহলী 101

35

স্থানীয়ভাবে নোডেজ ব্যবহার করা

var fs = require('fs')

var oldPath = 'old/path/file.txt'
var newPath = 'new/path/file.txt'

fs.rename(oldPath, newPath, function (err) {
  if (err) throw err
  console.log('Successfully renamed - AKA moved!')
})

(দ্রষ্টব্য: "আপনি যদি পার্টিশনগুলি অতিক্রম করছেন বা চলন্ত ফাইলগুলিকে সমর্থন না করে এমন ভার্চুয়াল ফাইল সিস্টেম ব্যবহার করছেন তবে এটি কাজ করবে না। [...]" - ফ্ল্যাভিয়ান ভলকেন সেপ্টেম্বর 2 '15 এ 12:50 ")


30

এমভি নোড মডিউলটি ব্যবহার করুন যা প্রথমে একটি করার চেষ্টা করবে fs.renameএবং তারপরে অনুলিপি করা এবং তারপরে লিঙ্কমুক্ত হবে।


একটি ফাইল সরানোর জন্য সাধারণ প্রয়োজনীয়তার জন্য ভাল কাজ করে।
আর্সেল্ডন

1
অ্যান্ড্রুর্ক এই mvনোড মডিউলটির লেখক হিসাবে উপস্থিত হয়েছে । আমি এনপিএম ইনস্টল করতে ব্যবহার করতে চাই; npm install mv --save-dev; এখানে এনপিএম লিঙ্কটি রয়েছে
রেড মটর

3
এ কেমন ডেভ নির্ভরতা? অ্যাপ্লিকেশনটির কাজ করার জন্য mv এর প্রয়োজন হয় না?
jgr0

17

util.pump নোড ০.১০ এ অবহিত এবং সতর্কতা বার্তা উত্পন্ন করে

 util.pump() is deprecated. Use readableStream.pipe() instead

সুতরাং স্ট্রিম ব্যবহার করে ফাইল অনুলিপি করার সমাধানটি হ'ল:

var source = fs.createReadStream('/path/to/source');
var dest = fs.createWriteStream('/path/to/dest');

source.pipe(dest);
source.on('end', function() { /* copied */ });
source.on('error', function(err) { /* error */ });

2
এটি দুটি ভিন্ন পার্টিশনে থাকা কোনও ফাইল অনুলিপি / সরানোর উপযুক্ত উপায়। ধন্যবাদ!
slickplaid

9

পুনঃনামকরণ ফাংশনটি ব্যবহার করে:

fs.rename(getFileName, __dirname + '/new_folder/' + getFileName); 

কোথায়

getFilename = file.extension (old path)
__dirname + '/new_folder/' + getFileName

ধরে নিচ্ছেন যে আপনি ফাইলের নামটি অপরিবর্তিত রাখতে চান।


4
সাবধানতা অবলম্বন করুন যদি আপনি বিভিন্ন পার্টিশনের মধ্যে ফাইলটির নাম পরিবর্তন করার চেষ্টা করেন তবে কিছু ভার্চুয়াল ফাইল সিস্টেমে (যেমন উদাহরণস্বরূপ ডকার)
ফ্লাভিয়েন ভোলকেন

8

fs-extraআইকনএই মডিউলটি আপনাকে এটা সঙ্গে এই কাজ করতে পারবেন move()পদ্ধতি। আমি ইতিমধ্যে এটি প্রয়োগ করেছি এবং আপনি যদি কোনও ফাইলকে একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে পুরোপুরি সরিয়ে নিতে চান - তবে এটি ভাল কাজ করে ie উত্স ডিরেক্টরি থেকে ফাইল অপসারণ। বেশিরভাগ বেসিক ক্ষেত্রে কাজ করা উচিত।

var fs = require('fs-extra')

fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile', function (err) {
 if (err) return console.error(err)
 console.log("success!")
})

5

ব্যবহার.পাম্প ব্যবহার করে এখানে একটি উদাহরণ রয়েছে >> >> আমি কীভাবে ফাইলকে নোড.জেএসে একটি পৃথক বিভাজন বা ডিভাইসে স্থানান্তর করব?

var fs = require('fs'),
    util = require('util');

var is = fs.createReadStream('source_file')
var os = fs.createWriteStream('destination_file');

util.pump(is, os, function() {
    fs.unlinkSync('source_file');
});

20
এটি লক্ষণীয় যে আপনাকে শুধুমাত্র ভলিউম জুড়ে ফাইলগুলি সরানোর সময় এটি করতে হবে। অন্যথায়, আপনি কেবল ব্যবহার করতে পারেন fs.rename()(একটি ভলিউমের মধ্যে কোনও ফাইলের নাম পরিবর্তন এবং এটি সরানো একই জিনিস)।
s4y

4
Use.pump অবমূল্যায়ন করা হয়।
অ্যান্ড্রুঙ্ক


লোকাল মেশিন থেকে সার্ভারে ফাইল স্থানান্তরিত করা সম্ভব?
Hulk1991

না, আপনাকে এর জন্য অন্য কিছু ব্যবহার করতে হবে (যেমন এফটিপি, এইচটিটিপি বা অন্য কোনও প্রোটোকল ব্যবহার করা)।
এলেসিয়োএলেক্স

4

8.0.0 এর চেয়ে বেশি নোড সংস্করণগুলির জন্য প্রতিশ্রুতি ব্যবহার করা:

const {promisify} = require('util');
const fs = require('fs');
const {join} = require('path');
const mv = promisify(fs.rename);

const moveThem = async () => {
  // Move file ./bar/foo.js to ./baz/qux.js
  const original = join(__dirname, 'bar/foo.js');
  const target = join(__dirname, 'baz/qux.js'); 
  await mv(original, target);
}

moveThem();

3
fs.renameআপনি ভলিউম সহ ডকার পরিবেশে থাকলে কেবল সতর্কতার কোনও শব্দ কার্যকর হয় না।
অতুল যাদব

ফাংশনে একটি asyncঘোষণা যুক্ত করুন moveThem
এইচ_আই

3

উপরের উত্তরে বর্ণিত কেবল আমার 2 সেন্ট : সামান্য সমন্বয় ছাড়াই ফাইল অনুলিপি করার জন্য অনুলিপি () পদ্ধতিটি ব্যবহার করা উচিত নয়:

function copy(callback) {
    var readStream = fs.createReadStream(oldPath);
    var writeStream = fs.createWriteStream(newPath);

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

    // Do not callback() upon "close" event on the readStream
    // readStream.on('close', function () {
    // Do instead upon "close" on the writeStream
    writeStream.on('close', function () {
        callback();
    });

    readStream.pipe(writeStream);
}

প্রতিশ্রুতিতে মোড়ানো কপির ফাংশন:

function copy(oldPath, newPath) {
  return new Promise((resolve, reject) => {
    const readStream = fs.createReadStream(oldPath);
    const writeStream = fs.createWriteStream(newPath);

    readStream.on('error', err => reject(err));
    writeStream.on('error', err => reject(err));

    writeStream.on('close', function() {
      resolve();
    });

    readStream.pipe(writeStream);
  })

তবে, মনে রাখবেন যে লক্ষ্য ফোল্ডারটি উপস্থিত না থাকলে ফাইল-সিস্টেম ক্র্যাশ হতে পারে।


3

আমি সব জড়িত ফাংশন পৃথক হবে (অর্থাত rename, copy, unlink) অবশ্যই, নমনীয়তা এবং promisify জেতার জন্য সবকিছু একে অপরের থেকে:

const renameFile = (path, newPath) => 
  new Promise((res, rej) => {
    fs.rename(path, newPath, (err, data) =>
      err
        ? rej(err)
        : res(data));
  });

const copyFile = (path, newPath, flags) =>
  new Promise((res, rej) => {
    const readStream = fs.createReadStream(path),
      writeStream = fs.createWriteStream(newPath, {flags});

    readStream.on("error", rej);
    writeStream.on("error", rej);
    writeStream.on("finish", res);
    readStream.pipe(writeStream);
  });

const unlinkFile = path => 
  new Promise((res, rej) => {
    fs.unlink(path, (err, data) =>
      err
        ? rej(err)
        : res(data));
  });

const moveFile = (path, newPath, flags) =>
  renameFile(path, newPath)
    .catch(e => {
      if (e.code !== "EXDEV")
        throw new e;

      else
        return copyFile(path, newPath, flags)
          .then(() => unlinkFile(path));
    });

moveFile কেবল একটি সুবিধাজনক ফাংশন এবং আমরা পৃথকভাবে ফাংশনগুলি প্রয়োগ করতে পারি, যখন উদাহরণস্বরূপ, আমাদের সূক্ষ্ম দানযুক্ত ব্যতিক্রম হ্যান্ডলিংয়ের প্রয়োজন হয়।


2

শেলজ একটি খুব সহজ সমাধান।

কমান্ড: এমভি ([বিকল্পসমূহ] উত্স, গন্তব্য)

উপলব্ধ বিকল্প:

-ফ: বল (ডিফল্ট আচরণ)

-n: ওভাররাইটিং রোধ করতে

const shell = require('shelljs');
const status = shell.mv('README.md', '/home/my-dir');
if(status.stderr)  console.log(status.stderr);
else console.log('File moved!');

1

এটি সামান্য কম অস্পষ্ট নামের সাথে তেওমন শিপাহির জবাবের পুনঃস্থাপন এবং আপনি এটির কল দেওয়ার চেষ্টা করার আগে কোড সংজ্ঞায়নের নকশা প্রিপিসল অনুসরণ করছেন। (নোড আপনাকে অন্যথায় কাজ করার অনুমতি দেয় তবে ঘোড়ার আগে কার্টটি রাখা ভাল অভ্যাস নয়))

function rename_or_copy_and_delete (oldPath, newPath, callback) {

    function copy_and_delete () {
        var readStream = fs.createReadStream(oldPath);
        var writeStream = fs.createWriteStream(newPath);

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

        readStream.pipe(writeStream);
    }

    fs.rename(oldPath, newPath, 
        function (err) {
          if (err) {
              if (err.code === 'EXDEV') {
                  copy_and_delete();
              } else {
                  callback(err);
              }
              return;// << both cases (err/copy_and_delete)
          }
          callback();
        }
    );
}

0

নীচে ইউআরএল এর সাহায্যে আপনি হয় আপনার ফাইল অনুলিপি উত্স থেকে গন্তব্য উত্স অনুলিপি বা সরাতে পারেন

https://coursesweb.net/nodejs/move-copy-file

/*********Moves the $file to $dir2 Start *********/
var moveFile = (file, dir2)=>{
  //include the fs, path modules
  var fs = require('fs');
  var path = require('path');

  //gets file name and adds it to dir2
  var f = path.basename(file);
  var dest = path.resolve(dir2, f);

  fs.rename(file, dest, (err)=>{
    if(err) throw err;
    else console.log('Successfully moved');
  });
};

//move file1.htm from 'test/' to 'test/dir_1/'
moveFile('./test/file1.htm', './test/dir_1/');
/*********Moves the $file to $dir2 END *********/

/*********copy the $file to $dir2 Start *********/
var copyFile = (file, dir2)=>{
  //include the fs, path modules
  var fs = require('fs');
  var path = require('path');

  //gets file name and adds it to dir2
  var f = path.basename(file);
  var source = fs.createReadStream(file);
  var dest = fs.createWriteStream(path.resolve(dir2, f));

  source.pipe(dest);
  source.on('end', function() { console.log('Succesfully copied'); });
  source.on('error', function(err) { console.log(err); });
};

//example, copy file1.htm from 'test/dir_1/' to 'test/'
copyFile('./test/dir_1/file1.htm', './test/');
/*********copy the $file to $dir2 END *********/



-6

আপনি move-fileএনপিএম প্যাকেজটি ব্যবহার করতে পারেন :

প্রথমে প্যাকেজটি ইনস্টল করুন:

$ npm install move-file

ব্যবহার:

const moveFile = require('move-file');

// moveFile Returns a Promise that resolves when the file has been moved
moveFile('source/unicorn.png', 'destination/unicorn.png')
  .then(() => {/* Handle success */})
  .catch((err) => {/* Handle failure */});

// Or use async/await
(async () => {
    try {
      await moveFile('source/unicorn.png', 'destination/unicorn.png');
      console.log('The file has been moved');
    } catch (err) {
      // Handle failure
      console.error(err);
    }
})();

সংক্ষিপ্ত এবং স্মার্ট উত্তর, ভাল @ পারিশিশাহ
আবদুল্লাহ পরিয়ানী

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