Sto provando a spostare un file da una partizione all'altra in uno script Node.js. Quando ho usato fs.renameSync
ho ricevuto Error: EXDEV, Cross-device link
. Lo coperei e cancellerei l'originale, ma non vedo neanche un comando per copiare i file. Come si può fare?Come si sposta un file su una partizione o un dispositivo diverso in Node.js?
risposta
È necessario copiare e scollegare quando si spostano file in partizioni diverse. Prova questo,
var fs = require('fs');
//var util = require('util');
var is = fs.createReadStream('source_file');
var os = fs.createWriteStream('destination_file');
is.pipe(os);
is.on('end',function() {
fs.unlinkSync('source_file');
});
/* node.js 0.6 and earlier you can use util.pump:
util.pump(is, os, function() {
fs.unlinkSync('source_file');
});
*/
So che questa è già una risposta, ma mi sono imbattuto in un problema simile e si è conclusa con qualcosa sulla falsariga di:
require('child_process').spawn('cp', ['-r', source, destination])
Quello che fa è chiamare il comando cp
("copia"). Dato che stiamo uscendo da Node.js, questo comando deve essere supportato dal tuo sistema.
io so che non è il più elegante, ma ha fatto quello che mi serviva :)
più Una soluzione al problema.
C'è un pacchetto chiamato fs.extra scritto da "coolaj86" su npm.
si utilizza in questo modo: npm install fs.extra
fs = require ('fs.extra');
fs.move ('foo.txt', 'bar.txt', function (err) {
if (err) { throw err; }
console.log ("Moved 'foo.txt' to 'bar.txt'");
});
Ho letto il codice sorgente di questa cosa. Tenta di eseguire uno standard fs.rename()
quindi, se fallisce, esegue una copia ed elimina l'originale utilizzando lo stesso util.pump()
utilizzato da @chandru.
A proposito, ho parlato coolaj86 su github e lui è consapevole che util.pump() è deprecato nel nodo 0.10 e verrà risolto a breve. – erapert
L'autore del pacchetto fs-extra è jprichardson e coolaj86 è un contributore (vedere https://github.com/jprichardson/node-fs-extra per ulteriori informazioni). – davidbourguignon
per importare il modulo e salvarlo il file package.json
npm install mv --save
quindi utilizzarlo in questo modo:
var mv = require('mv');
mv('source_file', 'destination_file', function (err) {
if (err) {
throw err;
}
console.log('file moved successfully');
});
questo non è un sostituto adatto per fs.renameSync, perché non è sincrono. https://github.com/andrewrk/node-mv/issues/9 – Michael
Ho fatto un modulo Node.js che solo gestisce per te . Non devi pensare se verrà spostato all'interno della stessa partizione o meno. È la soluzione più rapida disponibile, poiché utilizza la recente API Node.js fs.copyFile()
per copiare il file quando ci si sposta su un'altra partizione/disco.
Basta installare move-file
:
$ npm install move-file
quindi utilizzarlo in questo modo:
const moveFile = require('move-file');
(async() => {
await moveFile(fromPath, toPath);
console.log('File moved');
})();
E, a differenza delle altre soluzioni, pulisce la directory di origine. –
Non è molto dispendioso in termini di risorse? – Thomaschaaf
util.pump è obsoleto. usa is.pipe (os) e poi ascolta l'evento 'end' sul flusso di output. – andrewrk