الفصل التاسع: IO (الدخل/ الخرج)
ذكرنا سابقا ان puts/print/gets أنها عبارة عن دوال، أليس كذلك ؟ الإجابة خطأ بالطبع لأن Ruby is Fully OOP ف puts/print/gets يقعوا تحت ال Kernel module وهى module مثلها مثل أي module ولكن الذي يميزها إنها implemented by default
puts
تستخدم فى عملية الطباعة على ال stdout
print
تستخدم فى عملية الطباعة على ال stdout
gets
تستخدم فى قراءة string من ال stdin
ruby مثلها مثل العديد من اللغات بتقدم classes جاهزة للتعامل مع المجلدات والملفات
المجلدات
للتعامل مع المجلدات نستخدم ال Dir Class
العمل الحالي
pwd, getwd
هما طريقتين يستخدما فى الحصولعلى ال Current Path/Current Working Dir
تغيير المجلد
chdir(to)
إنشاء المجلدات
mkdir(new_dir_name, permissions)
نستخدم الطريقة mkdir فى إنشاء directory جديد بحيث إننا نحدد الإسم فى ال new_dir_name والتصاريح فى ال permissions
حذف المجلدات
Dir.delete(dir_name)
Dir.unlink(dir_name)
Dir.rmdir(dir_name)
نستخدم الطرق التالية وهى delete, unlink, rmdir
تصفح مجلد
entries
هى طريقة تعيد مصفوفة فيها كل محتويات المجلد، وعند عمل حلقة تكرار بسيطة على مصفوفة المدخلات، سيظهر لدينا كل محتويات المصفوفة:
Dir.chdir('C:\ruby\bin\\') #change to the dir
for entry in Dir.entries(Dir.getwd)
puts entry
end
Dir.entries(Dir.getwd) {|entry|
puts entry
}
Dir.entries(Dir.getwd) do |entry|
puts entry
end
Dir.foreach(Dir.getwd) {|entry|
puts entry
}
Dir.foreach(Dir.getwd) do |entry|
puts entry
end
كائنات المجلدات
تقدر تعمل Dir Stream او Dir Object او Dir Handler على حسب ما تريد، تفرض التسمية بإستخدام طريقة open او new من ال Dir Class
اولا دعنا نتفق على شئ مهم .. الذي يفتح شيء يجب أن يقفله ... مثلا أنت شغلت الحاسوب لتنجز مهمة معينة، فبعد إنجازها تقفل الجهاز.
نفس النظام فى التعامل مع ال Dirs/Files
إذا فتحت مجلد يجب أن تقفله .. واذا فتحت File يجب أن تقفله أيضا
جميل جدا... نفتح الStream كالتالى
dirObj=Dir.open('C:\ruby\bin\\')
dirObj.close
تستطيع أن تستخدم الطريقة new مثلما اشرت سابقا ..
path
للحصول على ال path
puts dirObj.path
#output: C:\ruby\bin\
tell
تعيد ال current position فى ال Directory
read
تقرأ ال next entry
rewind
تعمل set لل current position فى ال Directory إلى البداية - 0 -
each
نستخدمها فى محاولة ال iteration على ال entries
dirObj.each do |entry|
puts entry
end
dirObj.each {|entry|
puts entry
}
مثال:
dirObj=Dir.open('C:\ruby\bin\\') #open
#dirObj=Dir.new('C:\ruby\bin\\')
puts dirObj.path
puts dirObj.tell #the current position
puts dirObj.read #what's it ?
puts dirObj.tell #the current position
puts dirObj.read #what's it ?
puts dirObj.tell #the current position
puts dirObj.read #what's it ?
#set the current position to 0
dirObj.rewind
puts dirObj.tell
dirObj.close
#output
C:\ruby\bin\
0
.
1
..
2
erb.bat
0
الملفات
اولا دعنا نتفق على شئ مهم:
r => read only
r+ => read/write
w => write only
w+ => write/read
a => append at the end or create
a+ => append at the start or create
b => binary
delete(file_path)
هى طريقة تستخدم لحذف الملف
او تستطيع أن تستخدمها كالتالى
delete(file1, file2, file3)
rename(from, to)
هى طريقة تستخدم فى عمل rename لل file
ctime(file_path) (creation time)
هى طريقة تعيد تاريخ انشاء الfile
mtime(file_path) (last modification time)
هى طريقة تعيد تاريخ اخر تعديل على ال file
atime (file_path) (last access time)
هى طريقة تعيد تاريخ اخر مرة تم إستخدام ال file
puts File.mtime("C:\\ls.rb")
puts File.ctime("C:\\ls.rb")
puts File.atime("C:\\ls.rb")
#output:
Mon Nov 26 08:35:53 EET 2007
Mon Nov 26 08:35:53 EET 2007
Mon Nov 26 08:35:53 EET 2007
zero?
تختبر إذا كان طول الملف يساوي صفر أم لا.
اقرب مثال لها هى ال files اللى تنشىء باستخدام touch
exist?(file_name)
هى طريقة تستخدم فى إختبار هل ال file موجود أم لا
exists?(file_name)
نفس سابقتها ولكن obsolete
readable?(file_name)
هل الملف قابل للقرآءة
writeable?(file_name)
هل الملف قابل للكتابة
Executable?(file_name)
هل الملفقابل للتنفيذ
size(file_name), size?(file_name)
المساحة
ftype
تستخدم فى تحديد نوع الملف.
directory?(file_name)
تستخدم فى إختبار مجلد هل مطابق للاسم المعطى أم لا.
مثلما اتفقنا أي استخدام لمصدر يجب أن يقفل في نهاية البرنامج
الكتابة
syswrite, puts, putc
syswrite و puts يستخدموا فى كتابة string فى ال file
putc بتستخدم فى كتابة character
#Create a file Object in Write mode, if it exists it'll be overwritten
fileObj=File.new('C:\tstRuby.txt', 'w')
#Print a string to the file by using syswrite method of the file Object
fileObj.syswrite("Hello from Ruby IO!")
#Close the file object!
fileObj.close
Reading
fileObj=File.new('C:\tstRuby.txt', 'r')
#Read it
fileSrc=fileObj.gets
#print it
puts fileSrc
fileObj.close() #Close it.
each_byte
هى طريقة تستخدم فى عمل iteration على كل char
#Create a file Object in read mode
fileObj=File.new('C:\tstRuby.txt', 'r')
#Read it
fileObj.each_byte {|char|
putc char
}
#Close it
fileObj.close()
FileCopy.rb