मैं नोड.जेएस में फ़ाइलों को कैसे स्थानांतरित करूं?


151

मैं नोड.जेएस पर फाइलें (जैसे एमवी कमांड शेल) कैसे स्थानांतरित कर सकता हूं? क्या इसके लिए कोई विधि है या क्या मुझे एक फ़ाइल पढ़नी चाहिए, एक नई फ़ाइल को लिखना चाहिए और पुरानी फ़ाइल को निकालना चाहिए?

जवाबों:


157

Seppo0010 टिप्पणी के अनुसार, मैंने ऐसा करने के लिए पुनर्नामित फ़ंक्शन का उपयोग किया।

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

frenrename (पुरानेपथ, नयापथ, कॉलबैक)

में जोड़ा गया: v0.0.2

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

अतुल्यकालिक नाम (2)। पूर्ण कॉलबैक के लिए संभावित अपवाद के अलावा कोई तर्क नहीं दिया गया है।


5
उन लोगों के लिए जहां @ seppo0010 की टिप्पणी चली गई: यह मेरे उत्तर पर था, जिसे मैंने हटा दिया और ओपी पर एक टिप्पणी के रूप में पोस्ट किया।
मैट बॉल

6
यदि आप विभाजन को पार कर रहे हैं या चलती फ़ाइलों का समर्थन नहीं करने वाले वर्चुअल फाइल सिस्टम का उपयोग कर रहे हैं तो यह काम नहीं करेगा। आप बेहतर तरीके से इस समाधान का उपयोग कॉपी फ़ॉलबैक
फ़्लेवियन वोल्केन

"हानी" के तीसरे उत्तर में उदाहरण कोड है!
नाथन

47

इस उदाहरण से लिया गया: एक्शन में Node.js

एक चाल () फ़ंक्शन जो नाम बदल देता है, यदि संभव हो तो, या कॉपी करने के लिए वापस गिर जाता है

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.mame के बजाय fs.move (oldFile, newFile, function (इरेट) {....}) को कॉल करें?
जिज्ञासु

@ Curious101 आप इसे filemove.js जैसी फ़ाइल में डाल सकते हैं और इसे var filemove = आवश्यकता ('filemove') की तरह आयात कर सकते हैं; फिर इसे फिल्ममेव (...) की तरह उपयोग करें;
तेमन शिपाही

धन्यवाद @Teomanshipahi उस स्थिति में मैं mylibrary.js में जोड़ सकता हूं और वहां से इसका उपयोग कर सकता हूं। मुझे लगा कि यह प्रोटोटाइप तरीकों को जोड़ने की कुछ अच्छी तरह से ज्ञात विधि है इसलिए यह ऑब्जेक्ट में ही उपलब्ध हो जाता है।
उत्सुक २०

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
andrewrk इस mvनोड मॉड्यूल के लेखक प्रतीत होते हैं । मैं स्थापित करने के लिए npm का उपयोग करना पसंद करता हूं; npm install mv --save-dev; यहाँ एक npm लिंक है
लाल मटर

3
यह एक देवता पर निर्भरता कैसे है? कार्य करने के लिए ऐप को mv की आवश्यकता नहीं है?
jgr0

17

util.pump नोड 0.10 में पदावनत है और चेतावनी संदेश उत्पन्न करता है

 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
सावधान रहें यह काम नहीं करेगा यदि आप अलग-अलग विभाजनों के बीच फ़ाइल का नाम बदलने की कोशिश करते हैं, न ही कुछ वर्चुअल फ़ाइल सिस्टम (जैसे उदाहरण के लिए
docker

8

fs-extraमॉड्यूल आप इसे के साथ ऐसा करने की अनुमति देता है move()विधि। मैंने पहले ही इसे लागू कर दिया है और यह अच्छी तरह से काम करता है यदि आप पूरी तरह से एक निर्देशिका से दूसरे में फ़ाइल स्थानांतरित करना चाहते हैं - यानी। स्रोत निर्देशिका से फ़ाइल निकाल रहा है। ज्यादातर बुनियादी मामलों के लिए काम करना चाहिए।

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

यहाँ use.pump का उपयोग करके एक उदाहरण दिया गया है, >> मैं Node.js में किसी भिन्न विभाजन या डिवाइस में फ़ाइल कैसे स्थानांतरित करूँ?

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 को हटा दिया गया है।
andrewrk


क्या स्थानीय मशीन से सर्वर पर फ़ाइल ले जाना संभव है?
हल्क

नहीं, आपको इसके लिए कुछ और उपयोग करने की आवश्यकता है (जैसे कि FTP, HTTP या अन्य प्रोटोकॉल का उपयोग करके)।
एलेसियोलेक्स

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
H_I

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

Shelljs एक बहुत ही उपयोगी उपाय है।

कमांड: एमवी ([विकल्प, स्रोत, गंतव्य)

उपलब्ध विकल्प:

-f: बल (डिफ़ॉल्ट व्यवहार)

-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

नीचे दिए गए URL की सहायता से, आप अपनी फ़ाइल CURRENT स्रोत को गंतव्य स्रोत पर कॉपी या स्थानांतरित कर सकते हैं

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 *********/


-1

यदि आप नोड.जेएस स्रोत फ़ाइल को स्थानांतरित करने या नाम बदलने का प्रयास कर रहे हैं, तो इस https://github.com/viruschidai/node-mv पर प्रयास करें । यह उस फाइल के संदर्भ को अन्य सभी फाइलों में अपडेट करेगा।


-6

आप उपयोग कर सकते हैं move-file npm पैकेज का :

पहले पैकेज स्थापित करें:

$ 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
यह एक फ़ंक्शन के लिए एक कॉल है जिसे अभी तक नहीं बनाया गया है इसलिए यह केवल एक त्रुटि फेंक देगा।
स्टीव कैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.