Не существует механизма, позволяющего легко делать то, что вы хотите.
Вместо этого вам нужно будет открыть файл, удалить файл, открыть новый файл со старым именем для записи, записать содержимое, а затем записать новый файл из содержимого старого файла. Это довольно запутанное звучание, но в коде это просто:
$ cat prepend.rb
#!/usr/bin/ruby
File.open("passwd", "r") do |orig|
File.unlink("passwd")
File.open("passwd", "w") do |new|
new.write "test string"
new.write(orig.read())
end
end
Обратите внимание, что механизм, который я использовал, не беспокоит проверку ошибок - вы, вероятно, должны обрабатывать ошибки при каждом запросе File.open()
и запросе File.unlink()
- и предполагается, что все содержимое файла будет соответствовать в памяти. Краткий пример:
$ rm passwd
$ cp /etc/passwd .
$ ./prepend.rb
$ head passwd
test stringroot:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
$
Если вы хотите обрабатывать файлы, которые могут не умещаться полностью в памяти, вы должны закодировать цикл вроде этого (не проверено - лучше подумайте, псевдокод):
while (data=orig.read(4096)) {
new.write(data)
}
В качестве альтернативы вы можете записать во временный файл, и, если процесс записи завершится успешно, затем удалите файл и переименуйте временный файл на месте. Какой подход имеет для вас наибольшее значение.