2011-12-05 10 views

risposta

0

Ecco un modo semplice di fare questo usando metodi di funzionamento di file rubino:

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

È inoltre possibile utilizzare File.exists? per verificare se il file esiste o meno. Ciò restituirebbe un valore booleano vero se lo fa !!

+3

si potrebbe spiegare lo scopo di: 'script = $ 0', anche proteggere contro la lettura di un file più grande di memoria. –

6

Per precauzione mi consiglia di utilizzare tampone a meno che non si può garantire tutto il file sempre si inserisce nella memoria:

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 Molto corretto. Anche nel mondo di oggi con RAM multi-gigabyte, è importante prestare attenzione alla quantità che viene introdotta. Niente come mettere in ginocchio un grosso server dopo aver provato a leggere un file più grande della memoria disponibile. Difficile difendere un'azione del genere in un'impresa. Raccomanderei comunque di utilizzare i blocchi nidificati di 'File.open' per chiudere automaticamente i file. –

+0

Perché non utilizzare la versione a blocchi di 'open' che assicura che il file sia chiuso anche nel caso di un'eccezione? – qerub

+0

@Qerub Perché dipende da come si elaborerà tale eccezione. Il flusso di chiusura non è sempre la cosa giusta da fare, specialmente quando sono interessati due file. –

18

C'è un metodo molto utile per questo - il IO#copy_stream method - vedere l'output di ri copy_stream

utilizzo

Esempio:

+0

Perché non utilizzare la versione blocco di 'open' che si assicura che il file viene chiuso, anche nel caso di un'eccezione? – qerub

+0

Ancora meglio: perché non usare 'File.write ('src.txt'," Some text \ n ")'? – DNNX

+0

@DNNX Dai documenti, 'File.write' scrive' stringa'. Se i contenuti non sono file di solo testo, come le immagini, non funzionerà. Dovresti invece usare 'binread' e' binwrite'. – Alex

1

Ecco un veloce e c modo oncise di farlo.

# 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) } 

Un esempio per l'esecuzione sarebbe.

$ ruby this_script.rb from_file.txt to_file.txt 

Questo viene eseguito this_script.rb e prende in due argomenti attraverso la riga di comando. Il primo nel nostro caso è from_file.txt (testo viene copiato da) e il secondo argomento second_file.txt (testo essendo copiato).

3

Qui la mia implementazione

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 

Usage:

File.copy sourcepath, targetpath 
8

Per coloro che sono interessati, ecco una variante del IO#copy_stream, File#open + block risposta (s) (scritto contro rubino 2.2.x, 3 anni troppo tardi).

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

Proprio commentando che il 'B' indica' binmode' ([Modalità file binario] (https://ruby-doc.org/core-2.2.0/IO.html#method-c-new-label-IO+Open + Mode)). – Alex

0

Puoi anche uso File.binread e File.binwrite se si vuole trattenere il contenuto del file per un po '. (Altre risposte utilizzano un istante copy_stream invece.)

Se i contenuti sono diverso da file di testo normale, ad esempio immagini, utilizzando base File.read e File.write non funzionerà.

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

Fonte: binread, binwrite.

Problemi correlati