2011-12-05 69 views

Trả lời

0

Đây là một cách đơn giản để làm điều đó bằng các phương pháp hoạt động tập tin ruby:

source_file, destination_file = ARGV 
script = $0 

input = File.open(source_file) 
data_to_copy = input.read() # gather the data using read() method 

puts "The source file is #{data_to_copy.length} bytes long" 

output = File.open(destination_file, 'w') 
output.write(data_to_copy) # write up the data using write() method 

puts "File has been copied" 

output.close() 
input.close() 

Bạn cũng có thể sử dụng File.exists? để kiểm tra nếu tập tin tồn tại hay không. Điều này sẽ trả về một boolean đúng nếu nó !!

+3

Bạn có thể giải thích mục đích của: 'script = $ 0', cũng bảo vệ chống đọc tệp lớn hơn bộ nhớ. –

6

Để đề phòng tôi sẽ khuyên bạn sử dụng đệm, trừ khi bạn có thể đảm bảo toàn bộ tập tin luôn phù hợp với bộ nhớ:

File.open("source", "rb") do |input| 
     File.open("target", "wb") do |output| 
     while buff = input.read(4096) 
      output.write(buff) 
     end 
     end 
    end 
+0

+1 Rất chính xác. Ngay cả trong thế giới ngày nay với RAM nhiều gigabyte, điều quan trọng là phải chú ý đến số tiền được kéo vào. Chẳng có gì giống như lấy một máy chủ lớn đến đầu gối của nó sau khi cố đọc một tệp lớn hơn bộ nhớ có sẵn. Thật khó để bảo vệ một hành động như vậy trong một doanh nghiệp. Tôi khuyên bạn nên sử dụng các khối 'File.open' lồng nhau để tự động đóng các tệp mặc dù. –

+0

Tại sao không sử dụng phiên bản khối của 'mở' để đảm bảo tệp được đóng ngay cả trong trường hợp ngoại lệ? – qerub

+0

@Qerub Bởi vì nó phụ thuộc vào cách bạn sẽ xử lý ngoại lệ như vậy. Đóng luồng không phải lúc nào cũng đúng để làm, đặc biệt khi hai tệp bị ảnh hưởng. –

18

Có một phương pháp rất tiện dụng cho điều này - các IO#copy_stream method - xem đầu ra của ri copy_stream

Ví dụ sử dụng:

+0

Tại sao không sử dụng phiên bản khối của 'mở' để đảm bảo tệp được đóng ngay cả trong trường hợp ngoại lệ? – qerub

+0

Thậm chí tốt hơn: tại sao không sử dụng 'File.write ('src.txt'," Some text \ n ")'? – DNNX

+0

@DNNX Từ tài liệu, 'File.write' viết' chuỗi'. Nếu nội dung không phải là tệp văn bản thuần túy, chẳng hạn như hình ảnh, nội dung đó sẽ không hoạt động. Thay vào đó, bạn phải sử dụng 'binread' và' binwrite'. – Alex

1

Dưới đây là một nhanh và c oncise cách để làm điều đó.

# Open first file, read it, store it, then close it 
input = File.open(ARGV[0]) {|f| f.read() } 

# Open second file, write to it, then close it 
output = File.open(ARGV[1], 'w') {|f| f.write(input) } 

Ví dụ để chạy điều này sẽ là.

$ ruby this_script.rb from_file.txt to_file.txt 

này chạy this_script.rb và mất trong hai đối số thông qua các dòng lệnh. Người đầu tiên trong trường hợp của chúng tôi là from_file.txt (văn bản được sao chép từ) và đối số thứ hai second_file.txt (văn bản được sao chép vào).

3

đây thực hiện của tôi

class File 
    def self.copy(source, target) 
    File.open(source, 'rb') do |infile| 
     File.open(target, 'wb') do |outfile2| 
     while buffer = infile.read(4096) 
      outfile2 << buffer 
     end 
     end 
    end 
    end 
end 

Cách sử dụng:

File.copy sourcepath, targetpath 
8

Đối với những người quan tâm, đây là một biến thể của IO#copy_stream, File#open + block câu trả lời (s) (bằng văn bản đối với 2.2.x ruby, 3 năm quá muộn).

copy = Tempfile.new 
File.open(file, 'rb') do |input_stream| 
    File.open(copy, 'wb') do |output_stream| 
    IO.copy_stream(input_stream, output_stream) 
    end 
end 
+1

Chỉ cần nhận xét rằng 'b' cho biết' binmode' ([chế độ tệp nhị phân] (https://ruby-doc.org/core-2.2.0/IO.html#method-c-new-label-IO+Mở + Chế độ)). – Alex

0

Bạn có thể cũng sử dụng File.binreadFile.binwrite nếu bạn muốn giữ lại các nội dung tập tin cho một chút. (Câu trả lời khác sử dụng ngay lập tức copy_stream thay thế.)

Nếu nội dung là khác hơn là các file văn bản đơn giản, chẳng hạn như hình ảnh, sử dụng cơ bản File.readFile.write sẽ không hoạt động.

temp_image = Tempfile.new('image.jpg') 
actual_img = IO.binread('image.jpg') 
IO.binwrite(temp_image, actual_img) 

Nguồn: binread, binwrite.

Các vấn đề liên quan