Làm cách nào để di chuyển các tệp (như shell command mv) trên node.js? Có phương pháp nào cho điều đó hay tôi nên đọc một tệp, ghi vào một tệp mới và xóa tệp cũ hơn?Làm cách nào để di chuyển tệp trong node.js?
Trả lời
Theo seppo0010 bình luận, tôi đã sử dụng chức năng đổi tên để làm điều đó.
http://nodejs.org/docs/latest/api/fs.html#fs_fs_rename_oldpath_newpath_callback
fs.rename (oldPath, newPath, callback)
gia tăng trong: v0.0.2
oldPath <String> | <Buffer> newPath <String> | <Buffer> callback <Function>
Asynchronous đổi tên (2). Không có đối số nào ngoài một ngoại lệ có thể là được trao cho cuộc gọi lại hoàn thành.
Dưới đây là một ví dụ sử dụng util.pump, từ >>How do I move file a to a different partition or device in 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');
});
Nó đáng chú ý là bạn chỉ phải làm điều này khi di chuyển các tập tin trên volume. Nếu không, bạn chỉ có thể sử dụng ['fs.rename()'] (http://nodejs.org/docs/latest/api/fs.html#fs.rename) (trong khối lượng đổi tên một tệp và di chuyển nó là cùng một điều). – s4y
util.pump không được chấp nhận. – andrewrk
http://stackoverflow.com/questions/4568689/how-do-i-move-file-a-to-a-different-partition-in-node-js#comment17237127_4571377 –
Sử dụng mô-đun nút mv trước tiên sẽ cố gắng thực hiện fs.rename
và sau đó dự phòng để sao chép rồi hủy liên kết.
Làm việc tốt cho các yêu cầu đơn giản để di chuyển một tệp. – arcseldon
andrewrk dường như là tác giả của mô-đun nút 'mv' này. Tôi thích sử dụng npm để cài đặt; 'npm install mv --save-dev'; Đây là [npm link] (https://www.npmjs.com/package/mv) –
util.pump
bị phản đối trong nút 0,10 và tạo ra thông điệp cảnh báo
util.pump() is deprecated. Use readableStream.pipe() instead
Vì vậy, các giải pháp để sao chép các file sử dụng con suối là:
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 */ });
Đây là cách thích hợp để sao chép/di chuyển một tập tin nằm trên hai phân vùng khác nhau. Cảm ơn bạn! – slickplaid
Nếu bạn đang cố gắng để di chuyển hoặc đổi tên một Node.js tệp nguồn, hãy thử này https://github.com/viruschidai/node-mv. Nó sẽ cập nhật các tham chiếu đến tệp đó trong tất cả các tệp khác.
Ví dụ này lấy từ: Node.js in Action
Một move() chức năng đổi tên, nếu có thể, hoặc rơi trở lại để sao chép
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);
}
}
Làm việc như một sự quyến rũ. Cảm ơn! Nếu tôi có thể thêm một chút: 'di chuyển' có thể là một tên tốt hơn khi nó unlinks oldPath. – Jokester
Sử dụng chức năng đổi tên:
fs.rename(getFileName, __dirname + '/new_folder/' + getFileName);
nơi
getFilename = file.extension (old path)
__dirname + '/new_folder/' + getFileName
giả định rằng bạn muốn giữ nguyên tên tệp.
Hãy cẩn thận điều này sẽ không hoạt động nếu bạn cố gắng đổi tên tệp giữa các phân vùng khác nhau, không phải trên một số hệ thống tệp ảo (chẳng hạn như trình kết nối) –
Mô-đun fs-extra
cho phép bạn thực hiện việc này với phương pháp move()
. Tôi đã thực hiện nó và nó hoạt động tốt nếu bạn muốn hoàn toàn di chuyển một tập tin từ một thư mục khác - tức là. xóa tệp khỏi thư mục nguồn. Nên làm việc cho hầu hết các trường hợp cơ bản.
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!")
})
đây là một rehash của teoman shipahi's answer với một tên hơi ít mơ hồ, và làm theo tấm priciple thiết kế xác định mã trước khi bạn cố gắng để gọi nó. (Trong khi nút cho phép bạn làm khác, nó không phải là một thực hành tốt để đặt giỏ hàng trước khi con ngựa.)
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();
}
);
}
Sử dụng nodejs natively
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!')
})
Đối với những người tự hỏi, nơi nhận xét của @ seppo0010 đã đi: nó đã được trên câu trả lời của tôi, mà tôi đã xóa và đăng như một bình luận trên OP. –
Điều này sẽ không hoạt động nếu bạn đang đi qua phân vùng hoặc sử dụng hệ thống tệp ảo không hỗ trợ di chuyển tệp. Bạn nên sử dụng [giải pháp này] (http://stackoverflow.com/a/29105404/532695) với một bản sao dự phòng –