ऐसा करने के लिए कोई तंत्र मौजूद नहीं है जो आप आसानी से करना चाहते हैं।
इसके बजाय, आपको फ़ाइल खोलने, फ़ाइल को हटाने, पुराने नाम से एक नई फ़ाइल खोलने, अपनी सामग्री लिखने, और फिर पुरानी फ़ाइल की सामग्री से नई फ़ाइल लिखने की आवश्यकता होगी। यह सुंदर लग घुमावदार लेकिन कोड में सीधा है है:
$ 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)
}
एक विकल्प के रूप में, आप एक अस्थायी फ़ाइल को लिख सकते हैं, और यदि लेखन प्रक्रिया सफल हो जाती है, तो फ़ाइल को हटाएं और अस्थायी फ़ाइल का नाम बदलें। जो भी दृष्टिकोण आपको सबसे ज्यादा समझ में आता है।
original_file = './original_file'
new_file = original_file + '.new'
परीक्षण सेट करें::
File.copy_stream(myfile,tempfile)
f = File.open(myfile,'w')
f.write("Hello\n#{File.open(tempfile,'r').read}")
f.close
File.delete(tempfile)
फ़ाइल को स्लिपिंग सावधान रहें। यह स्मृति में पूरी फ़ाइल को पढ़ने के लिए एक स्केलेबल समाधान नहीं है। –
मुझे यह व्यक्तिगत रूप से सरल टिंकरिंग के लिए पसंद है। – steve
सरल मामले के लिए सबसे अच्छा समाधान। –