混合file.write和系統調用我有一個調用了寫入文件中的兩個系統命令代碼,我需要在這些電話之間添加別的東西從我的代碼:是寫同一個文件
File.open('test.txt', 'w') {|f|
`echo 1 > #{f.path}`
f.write '2'
`echo 3 >> #{f.path}`
}
作爲結果該文件包含只是
2
3
第一行缺失。我確信有一個簡單的解決方案,但我找不到它。
混合file.write和系統調用我有一個調用了寫入文件中的兩個系統命令代碼,我需要在這些電話之間添加別的東西從我的代碼:是寫同一個文件
File.open('test.txt', 'w') {|f|
`echo 1 > #{f.path}`
f.write '2'
`echo 3 >> #{f.path}`
}
作爲結果該文件包含只是
2
3
第一行缺失。我確信有一個簡單的解決方案,但我找不到它。
回答我的問題:
File.open('test.txt', 'w') {|f|
`echo 11 > #{f.path}`
f.seek(0, IO::SEEK_END)
f.write "2\n"
f.flush
`echo 33 >> #{f.path}`
}
您正在以「寫入」模式打開文件,該模式正在打破第一個回顯。而是使用「追加」模式。此外,在寫入「2」之後,您不會沖洗,因此當您讀回時它會失靈。請記住,f.write不會附加換行符,因此您可能也需要這樣做。
irb(main):020:0> File.open('asdf', 'a') do |f|
irb(main):021:1* `echo 1 > asdf`
irb(main):022:1> f.write("2\n") and f.flush
irb(main):023:1> `echo 3 >> asdf`
irb(main):024:1> end
=> ""
irb(main):025:0> File.read('asdf')
=> "1\n2\n3\n"
irb(main):026:0> puts File.read('asdf')
1
2
3
的File.open(name, 'a')
是重要的組成部分。它意味着追加到這個文件而不是覆蓋它。有關文件打開模式的說明,請參見http://www.ruby-doc.org/core-2.0/IO.html#method-c-new和What are the Ruby File.open modes and options?。
如果刪除任何現有的文件很重要,第一個回波將隱含照顧的是(因爲它是一個單一>)。或者你也可以做到這一點的紅寶石明確:
File.delete('asdf') if File.exists?('asdf')
感謝。我不明白爲什麼在''w''模式下打開文件會破壞第一個'echo'。另外,在寫入之前,我需要銷燬任何現有的文件。 – akonsu
我不知道文件內部的工作方式。這可能是因爲它實際上並沒有什麼堅持到磁盤,直到塊退出或沖洗被調用。發生這種情況時,它會覆蓋回聲。 – olamork