Il n'existe aucun mécanisme permettant de faire facilement ce que vous voulez faire.
Au lieu de cela, vous devrez ouvrir le fichier, supprimer le fichier, ouvrir un nouveau fichier sous l'ancien nom pour l'écriture, écrire votre contenu, puis écrire le nouveau fichier à partir du contenu de l'ancien fichier. C'est assez alambiqué à première vue, mais c'est simple en code :
$ 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
Notez que le mécanisme que j'ai utilisé ne prend pas la peine de vérifier les erreurs -- vous devriez probablement gérer les erreurs à chaque fois qu'il y en a une. File.open()
et la File.unlink()
et il suppose que le contenu entier du fichier tiendra dans la mémoire. Un petit exemple :
$ 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
$
Si vous voulez gérer des fichiers qui ne tiennent pas entièrement dans la mémoire, vous devriez coder une boucle comme celle-ci (non testé - il vaut mieux considérer ce pseudo-code) :
while (data=orig.read(4096)) {
new.write(data)
}
Comme alternative, vous pouvez écrire dans un fichier temporaire, et si le processus d'écriture réussit, entonces supprimer le fichier et renommer le fichier temporaire en place. Quelle que soit l'approche la plus logique pour vous.