安全に脱出と読み上げるファイルパスをruby
質問
んだの保存数情報の一部についてファイルです。いすぎる派手なって思ったのような一行当たりの項目テキストファイルです。のようなこと:
# write
io.print "%i %s %s\n" % [File.mtime(fname), fname, Digest::SHA1.file(fname).hexdigest]
# read
io.each do |line|
mtime, name, hash = line.scanf "%i %s %s"
end
もちろんこれは当てはまりませんが、ファイル名を含むことができスペース(破うな入力は、c言語ではscanf)改(破IO#れています。
改行の問題を避けることができ落下による利用そのような気が('')
while not io.eof?
mtime = Time.at(io.gets(" ").to_i)
name = io.gets " "
hash = io.gets "\n"
end
関空間の名前がついています。今が一定になるようにすること。
注意:私のようなスペースの記録として区切り文字がありません号変更することで一つの楽しみです。の場合はファイル名ものであることがでascii nul"\0"がnul区切りのテキストファイルのようになっていテキストファイルはもう...
また、壁面のテキストの詳細を繰り返しの悪戦苦闘し脱出機能とその相互れてくれたんでないかと、思ったりしました。まんだ最終結果:
def write_name(io, val)
io << val.gsub(/([\\ ])/, "\\\\\\1") # yes that' 6 backslashes !
end
def read_name(io)
name, continued = "", true
while continued
continued = false
name += io.gets(' ').gsub(/\\(.)/) do |c|
if c=="\\\\"
"\\"
elsif c=="\\ "
continued=true
" "
else
raise "unexpected backslash escape : %p (%s %i)" % [c, io.path, io.pos]
end
end
end
return name.chomp(' ')
end
私は幸せではないとread_name.この方法は長akwardんべきではないこと。
をさせることなどによって、ここで作ってみたのちその他の方法:
のbittorrent符号化/php serialize方法:prefixのファイル名の長さは名前だけio.read(name_len.to_i).でも本物のピを編集ファイルです。この時点でまだ途中のバイナリ形式です。
String#査:こう明示的に作用する。それ以外のように取得する唯一の方法の値を戻しはじます。......そんなの、そんなに<エバール>-ing stringんの発生から信頼されるデータです。
います。すか?なんじゃないかlibでいます。私を見落とさないよう明らかな?ついてはどのように捉えている。
解決
と言ったら"保存"というお店の情報のファイルとは何ですか?
ご利用可能に CSVモジュール からRubyの標準図書館があります。この意味する区切り文字はコンマではなくどこに行くにも便利ですべてのエスケープ処理unescapingます。
場合は、valueに空間の値が同封され
"quotes"
場合に値を含む引用符を引用した文字を逃れたとして2つの引用文字など
"hello"
となる"""hello"""
書の内容をファイル:
require 'csv'
outfile = File.open('csvout', 'wb')
CSV::Writer.generate(outfile) do |csv|
csv << [File.mtime(fname), fname, Digest::SHA1.file(fname).hexdigest]
end
outfile.close
読みて:
CSV::Reader.parse(File.open('csvout', 'rb')) do |row|
p row
end
他のヒント
CSVは、上述したように、良い選択です。もう一つは、缶CSVよりも多くの任意のデータを扱うことができるYAML(「YAMLはマークアップ言語ではない」)、です。ここではいくつかのデータがあります:
require 'pp'
require 'yaml'
h = {
:first_name => 'Fred',
:last_name => 'Flinstone',
:children => ['Bam Bam', 'Pebbles'],
:exclamation => 'Yabba Dabba Doo',
}
レッツ・書き込みYAML形式のファイルへのデータ:
File.open('/tmp/foo.yaml', 'w') do |file|
file.write h.to_yaml
end
今度は、YAMLはどのようなものか見てみましょう
$ cat /tmp/foo.yaml
---
:exclamation: Yabba Dabba Doo
:first_name: Fred
:last_name: Flinstone
:children:
- Bam Bam
- Pebbles
最後のはYAMLファイルからデータを復元させます:
pp YAML.load_file('/tmp/foo.yaml')
# => {:exclamation=>"Yabba Dabba Doo",
# => :first_name=>"Fred",
# => :last_name=>"Flinstone",
# => :children=>["Bam Bam", "Pebbles"]}