Ruby 1.9を使用して複数のファイルを開いてアーカイブにコピーしています。バイナリファイルがいくつかありますが、いくつかはバイナリファイルではありません。 Ruby 1.9ではバイナリファイルをバイナリとして自動的に開かないので、自動的にそれらを開く方法はありますか?Rubyでファイルをバイナリで自動的に開く
答えて
実際、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')
で明示的にエンコーディングを設定することで、同じことを達成できます。これは、バイナリを文字列に読み込んで移動する場合(キーをデータベースに保存するなど)には重要です。
UNIXのようなプラットフォームでは、ファイルを「バイナリ」モードと「テキスト」モードで開くことに違いはありません。 Windowsでは、 "text"モードは改行をDOSスタイルに変換し、 "binary"モードは改行をDOSスタイルに変換します。
Windowsプラットフォームで改行が必要な場合を除き、すべてのファイルを「バイナリ」モードで開くだけです。テキストファイルを「バイナリ」モードで読むことには害はない。
本当に区別したい場合は、File.extname(filename)と ".txt"や ".class"などの既知の拡張子のリストを一致させる必要があります。
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)
File.binread(file)も可能です。 – peter
はい、 'File'クラスの親は' IO'クラスです。 –
この回答は間違いです。 Rubyは文字列を読み込み、1.9では文字列にエンコーディングが関連付けられています。詳細については、高度に修飾された答えを見て、これを無視してください。アレックスがそれを削除できるのであれば、それが望ましいだろう。 –
私はそれを削除するだけで、既存の回答は意味をなさないでしょう( "AlexDによる回答...")。この回答の情報(改行の変換で 'b'フラグの効果について言及する)が最初に他の情報の情報と統合されていると良いでしょう。 –