2012-01-19 17 views
14

Ruby 1.9を使用して複数のファイルを開いてアーカイブにコピーしています。バイナリファイルがいくつかありますが、いくつかはバイナリファイルではありません。 Ruby 1.9ではバイナリファイルをバイナリとして自動的に開かないので、自動的にそれらを開く方法はありますか?Rubyでファイルをバイナリで自動的に開く

答えて

30

実際、Alex Dによる以前の回答は不完全です。

"rb"に注意してください)

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

異なっている:それはUnixファイルシステムには、「テキスト」モードが存在しないことは事実だが、Rubyは、バイナリと非バイナリモードでファイルを開くとの違いを生むん

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

docsのように、外部エンコーディングをASCII-8BITに設定すると、UTF-8で結果を解釈しようとしないようにRubyに指示します。 s.force_encoding('ASCII-8BIT')で明示的にエンコーディングを設定することで、同じことを達成できます。これは、バイナリを文字列に読み込んで移動する場合(キーをデータベースに保存するなど)には重要です。

2

UNIXのようなプラットフォームでは、ファイルを「バイナリ」モードと「テキスト」モードで開くことに違いはありません。 Windowsでは、 "text"モードは改行をDOSスタイルに変換し、 "binary"モードは改行をDOSスタイルに変換します。

Windowsプラットフォームで改行が必要な場合を除き、すべてのファイルを「バイナリ」モードで開くだけです。テキストファイルを「バイナリ」モードで読むことには害はない。

本当に区別したい場合は、File.extname(filename)と ".txt"や ".class"などの既知の拡張子のリストを一致させる必要があります。

+2

この回答は間違いです。 Rubyは文字列を読み込み、1.9では文字列にエンコーディングが関連付けられています。詳細については、高度に修飾された答えを見て、これを無視してください。アレックスがそれを削除できるのであれば、それが望ましいだろう。 –

+0

私はそれを削除するだけで、既存の回答は意味をなさないでしょう( "AlexDによる回答...")。この回答の情報(改行の変換で 'b'フラグの効果について言及する)が最初に他の情報の情報と統合されていると良いでしょう。 –

9

Rubyはバイナリ読み出し(IO.binread)のための別の方法がある1.9.1および1.9.3以降も(IO.binwrite)を書き込むための1つがあるので:

を読み取るためには:

content = IO.binread(file) 

書き込みの場合:IO以来

IO.binwrite(file, content) 

Fileの親クラスである、あなたはまた、次のWHを行うことができますおそらくより表現力があります:

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

File.binread(file)も可能です。 – peter

+1

はい、 'File'クラスの親は' IO'クラスです。 –