2011-12-20 40 views

Trả lời

86

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.

+4

Đố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. –

+4

Đ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 –

5

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'); 
}); 
+17

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

+3

util.pump không được chấp nhận. – andrewrk

+0

http://stackoverflow.com/questions/4568689/how-do-i-move-file-a-to-a-different-partition-in-node-js#comment17237127_4571377 –

19

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.

+0

Làm việc tốt cho các yêu cầu đơn giản để di chuyển một tệp. – arcseldon

+0

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) –

14

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

Đâ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

-1

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.

24

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

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

8

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.

+3

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) –

4

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!") 
}) 
0

đâ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(); 
     } 
    ); 
} 
4

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!') 
}) 
Các vấn đề liên quan