2010-12-31 13 views
30

Tôi đang cố chuyển một tệp từ phân vùng này sang phân đoạn khác trong tập lệnh Node.js. Khi tôi sử dụng fs.renameSync tôi đã nhận được Error: EXDEV, Cross-device link. Tôi muốn sao chép nó và xóa bản gốc, nhưng tôi không thấy lệnh để sao chép tệp. Điều này có thể giải quyết như thế nào?Làm cách nào để di chuyển tệp vào một phân vùng hoặc thiết bị khác trong Node.js?

Trả lời

51

Bạn cần sao chép và hủy liên kết khi di chuyển tệp qua các phân đoạn khác nhau. Hãy thử điều này,

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

Và, không giống như các giải pháp khác, dọn dẹp các thư mục nguồn. –

+1

Đây không phải là nguồn tài nguyên rất chuyên sâu? – Thomaschaaf

+7

util.pump không được chấp nhận. sử dụng is.pipe (os) và sau đó lắng nghe sự kiện 'kết thúc' trên luồng đầu ra. – andrewrk

6

Tôi biết điều này đã được trả lời, nhưng tôi chạy qua một vấn đề tương tự và kết thúc với một cái gì đó dọc theo dòng:

require('child_process').spawn('cp', ['-r', source, destination]) 

Điều này không là gọi lệnh cp ("sao chép"). Vì chúng tôi đang bước ra ngoài Node.js, lệnh này cần được hệ thống của bạn hỗ trợ.

Tôi biết nó không phải là thanh lịch nhất, nhưng nó đã làm những gì tôi cần :)

+0

điều này là tốt nếu bạn không cần phải hỗ trợ Windows – Lloyd

+4

@Lloyd vì vậy nó luôn luôn tốt: D – ruX

7

Một giải pháp nữa cho vấn đề.

Có một gói gọi là fs.extra được viết bởi "coolaj86" trên npm.

Bạn sử dụng nó như vậy: 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'"); 
}); 

Tôi đã đọc các mã nguồn cho điều này. Nó cố gắng để làm một tiêu chuẩn fs.rename() sau đó, nếu nó không thành công, nó có một bản sao và xóa bản gốc bằng cách sử dụng cùng một util.pump() mà @chandru sử dụng.

+0

Bằng cách này, tôi đã nói với coolaj86 trên github và ông nhận thức được rằng util.pump() không được chấp nhận trong nút 0.10 và sẽ được sửa chữa nhanh chóng. – erapert

+0

Tác giả của gói fs-extra là jprichardson và coolaj86 là một cộng tác viên (xem https://github.com/jprichardson/node-fs-extra để biết thêm). – davidbourguignon

4

để nhập khẩu các mô-đun và lưu nó vào tập tin package.json bạn

npm install mv --save 

sau đó sử dụng nó như vậy:

var mv = require('mv'); 

mv('source_file', 'destination_file', function (err) { 
    if (err) { 
     throw err; 
    } 
    console.log('file moved successfully'); 
}); 
+0

đây không phải là sự thay thế phù hợp cho fs.renameSync, vì nó không đồng bộ. https://github.com/andrewrk/node-mv/issues/9 – Michael

2

tôi đã thực hiện một mô-đun Node.js mà chỉ xử lý nó cho bạn . Bạn không phải suy nghĩ về việc liệu nó sẽ được di chuyển trong cùng một phân vùng hay không. Đó là giải pháp nhanh nhất hiện có, vì nó sử dụng API Node.js fs.copyFile() gần đây để sao chép tệp khi di chuyển đến một phân vùng/đĩa khác.

Chỉ cần cài đặt move-file:

$ npm install move-file 

Sau đó sử dụng nó như thế này:

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

(async() => { 
    await moveFile(fromPath, toPath); 
    console.log('File moved'); 
})(); 
Các vấn đề liên quan