2012-01-19 9 views
14

sto usando Ruby 1.9 per aprire diversi file e copiarli in un archivio. Ora ci sono alcuni file binari, ma alcuni non lo sono. Poiché Ruby 1.9 non apre automaticamente i file binari come file binari, esiste comunque un modo per aprirli automaticamente? (Quindi ".class" sarebbe binario, ".txt" non)aprire automaticamente un file in formato binario con Ruby

risposta

30

realtà, la risposta precedente Alex D è incompleta. Mentre è vero che non esiste un modo "testo" nel file system Unix, Ruby non fare la differenza tra l'apertura dei file in modalità binaria e non binario:

s = File.open('/tmp/test.jpg', 'r') { |io| io.read } 
s.encoding 
=> #<Encoding:UTF-8> 

è diverso da (notare il "rb")

s = File.open('/tmp/test.jpg', 'rb') { |io| io.read } 
s.encoding 
=> #<Encoding:ASCII-8BIT> 

Quest'ultimo, come dire il docs, imposta la codifica esterna su ASCII-8BIT che dice a Ruby di non tentare di interpretare il risultato su UTF-8. È possibile ottenere la stessa cosa impostando la codifica in modo esplicito con s.force_encoding('ASCII-8BIT'). Questa è la chiave se vuoi leggere binari in una stringa e spostarli (ad es. Salvarli in un database, ecc.).

2

Su piattaforme di tipo Unix, non vi è alcuna differenza tra l'apertura di file nelle modalità "binario" e "testo". Su Windows, la modalità "testo" converte le interruzioni di linea in stile DOS e la modalità "binaria" no.

A meno che non hanno bisogno di conversione di riga su piattaforme Windows, basta aprire tutti i file in modalità "binario". Non c'è nulla di male a leggere un file di testo in modalità "binario".

Se si desidera veramente distinguere, è necessario abbinare File.extname (nome file) a un elenco di estensioni note come ".txt" e ".class".

+2

Si noti che questa risposta è errata. Ruby si legge in una stringa e a partire da 1.9 quella stringa ha una codifica associata. Vedi più risposta altamente modificata per i dettagli e ignorala. Se Alex può eliminarlo sarebbe preferibile. –

+0

Se lo elimini, la risposta esistente non ha senso ("la risposta di AlexD ..."). Sarebbe meglio se le informazioni contenute in questa risposta (che menzionano l'effetto del flag "b" sulla conversione dell'intervallo di riga) siano consolidate con le informazioni nell'altra prima. –

9

Da rubino 1.9.1 esiste un metodo separato per la lettura binaria (IO.binread) e poiché 1.9.3 v'è uno per la scrittura (IO.binwrite) così:

Per leggere:

content = IO.binread(file) 

per la scrittura:

IO.binwrite(file, content) 

Dal IO è la classe padre di File, si potrebbe anche fare la seguente wh È probabilmente più espressivo:

content = File.binread(file) 
File.binwrite(file, content) 
+2

File.binread (file) è anche possibile – peter

+1

Sì, dal momento che il genitore della classe 'File' è la classe' IO'. –

Problemi correlati