Author Topic: IO  (Read 598 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
IO
« on: October 26, 2008, 05:31:00 PM »

الفصل التاسع: 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

هى طريقة تعيد مصفوفة فيها كل محتويات المجلد، وعند عمل حلقة تكرار بسيطة على مصفوفة المدخلات، سيظهر لدينا كل محتويات المصفوفة:
Code: [Select]
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 كالتالى
Code: [Select]
dirObj=Dir.open('C:\ruby\bin\\')

dirObj.close

تستطيع أن تستخدم الطريقة new مثلما اشرت سابقا ..

path
للحصول على ال path

Code: [Select]
puts dirObj.path 
#output: C:\ruby\bin\


tell
تعيد ال current position فى ال Directory

read
تقرأ ال next entry

rewind
تعمل set لل current position فى ال Directory إلى البداية - 0 -

each
نستخدمها فى محاولة ال iteration على ال entries
Code: [Select]
dirObj.each do |entry|
     puts entry
end

dirObj.each {|entry|
     puts entry
}

مثال:
Code: [Select]
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

Code: [Select]
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
Code: [Select]
#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
Code: [Select]
fileObj=File.new('C:\tstRuby.txt', 'r')

#Read it
fileSrc=fileObj.gets

#print it
puts fileSrc

fileObj.close() #Close it.

each_byte
هى طريقة تستخدم فى عمل iteration على كل char
Code: [Select]
#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


Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/