الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدرس السابع في لغة Object pascal : الملفات(1)

بدأه أحمد أبو عبد البر في 23 مارس 2013 · 0 رد · 4,067 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله الرحمن الرحيم

الملفات files

 

الملفات هي من أهم العناصر في نظام التشغيل والبرامج عموماً، فإن بعض إجزاء نظام التشغيل نفسها هي عبارة عن ملفات. والمعلومات والبيانات هي عبارة عن ملفات، مثل الصور والكتب والبرامج والنصوص البسيطة هي عبارة عن ملفات. ويجب على نظام التشغيل توفير إمكانية لإنشاء الملفات، ولقراءتها وكتابتها وتحريرها وحذفها.

 

تنقسم الملفات إلى عدة أنواع بناءً على عدة أوجه نظر. فيمكن تقسيم الملفات إلى ملفات تنفيذية وملفات بيانات، حيث أن الملفات التنفيذية هي التي تمثل البرامج وأجزائه التنفيذية مثل الملف الثنائي الذي يحتوي على كود يفهمه نظام التشغيل ومثال لها الملفات التنفيذية التي تصدر عن مترجم الفري باسكال أو الـ gcc والتي يمكن نقلها في عدد من الأجهزة التي تحتوي على نفس نظام التشغيل ثم تشغيلها بالنقر عليها أو بكتابة إسمها في شاشة الطرفية console. وكمثال لها برنامج اﻵلة الحاسبة، محرر النصوص، برامج اﻷلعاب، إلخ.

أما النوع الثاني فهي ملفات البيانات التي لاتحتوى على كود ولاتمتلك إمكانية التشغيل، إنما تحتوي على بيانات بسيطة أو معقدة يمكن قراءتها مثل النصوص والملفات المصدرية للغات البرمجة مثل first.lpr ، أو الصور وملفات الصوت التي هي عبارة عن بيانات يمكن عرضها بإستخدام برامج معينة مثل برامج تحرير الصور وبرامج تعدد الوسائط multimedia. وكمثال لهذه الملفات ملفات الصوت .mp3 وملفات الكتب .pdf

 

يمكننا كذلك تقسيم الملفات من حيث نوع البيانات إلى قسمين:

 

  1. ملفات نصية بسيطة يمكن إنشائها وقراءتها عن طريق أدوات بسيطة في نظام التشغيل مثل cat التي تعرض محتويات ملف نصي في نظام لينكس، و type التي تطبع محتويات ملف نصي في وندوز، و vi التي تقوم بتحرير وإنشاء الملفات النصية في نظام لينكس.

  2. ملفات بيانات ثنائية وهي يمكن أن تحتوى على رموز غير مقروءة وهذه الملفات لاتصلح لأن يقوم المستخدم بتحريرها أو قراءتها مباشرة، بل يجب عليه إستخدام برامج محددة لهذه العمليات. مثل ملفات الصور إذا حاول المستخدم قراءتها بإستخدام cat مثلاً فإن يحصل على رموز لاتُفهم، لذلك يجب فتحها بإستخدام برامج عرض أو تحرير مثل المتصفح أو برنامج Gimp. كذلك يمكن أن يكون مثال لهذه الأنواع ملفات قواعد البيانات البسيطة مثل paradox, dBase فهي عبارة عن ملفات ثنائية تُخزن فيها سجلات تحتوى على معلومات منظمة بطريقة معينة.

 

 

النوع الآخر من التقسيم للملفات هو طريقة الوصول والكتابة، حيث يوجد نوعين من الملفات:

 

  1. ملفات ذات وصول تسلسلي sequential access files: ومثال لها الملفات النصية، وتتميز بأن طول السجل أو السطر فيها غير ثابت، لذلك لامكن معرفة موقع سطر معين في الملف. ويجب فتح الملف للقراءة فقط أو الكتابة فقط، ولا يمكن الجمع بين الوضعين (الكتابة والقراءة) ولايمكن تعديلها بسهولة إلا بقراءتها كاملة في مخزن مؤقت ثم تعديل أسطر معينة فيها ثم مسح الملف وكتابته من جديد. كذلك فإن القراءة والكتابة تتم بتسلسل وهو من بداية الملف إلى نهايته، حيث لايمكن الرجوع سطر إلى الوراء.

  2. ملفات ذات وصول عشوائي random access files: وهي ملفات ذات طول سجل ثابت، حين أن السجل يمثل أصغر وحدة يتعامل معها البرنامج في القراءة، الكتابة والتعديل. ويمكن الجمع بين الكتابة والقراءة في نفس اللحظة، مثلاً يمكن قراءة السجل الخامس، ثم نسخ محتوياته في السجل الأخير. ويمكن الوصول مباشرة إلى أي سجل دون التقيد بمكان القراءة أو الكتابة الحالي. فمثلاً إلى كان طول السجل هو 5 حروف أو بايت، فإن السجل الخامس يبدأ في الموقع رقم 50 في هذا الملف.

 

الملفات النصية text files

 

الملفات النصية كما سبق ذكره هي ملفات بسيطة يمكن قراءتها بسهولة. ومن ناحية الوصول هي ملفات تسلسلية sequential files حيث يجب القراءة فقط في إتجاه واحد وهو من البداية للنهاية ويجب الكتابة فيها بنفس الطريقة.

لعمل برنامج بسيط يقوم بقراءة محتويات ملف، علينا أولاً إنشاء ملفات نصية أو البحث عنها ثم وضعها في الدليل أو المجلد الذي يوجد فيه البرنامج ثم تنفيذ البرنامج التالي:

 

 

برنامج قراءة ملف نصي

 

program ReadFile;

{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, sysUtils
  { you can add units after this };

var
  FileName: string;
  F: TextFile;
  Line: string;
begin
  Write('Input a text file name: ');
  Readln(FileName);
  if FileExists(FileName) then
  begin
    // Link file variable (F) with physical file (FileName)
    AssignFile(F, FileName);

    Reset(F); // Put file mode for read, file should exist

    // while file has more lines that does not read yet do the loop
    while not Eof(F) do 
    begin
      Readln(F, Line); // Read a line from text file
      Writeln(Line);   // Display this line in user screen
    end;
    CloseFile(F); // Release F and FileName connection
  end
  else // else if FileExists..
    Writeln('File does not exist');
  Write('Press enter key to close..');
  Readln;
end.

 

 

بعد تنفيذ البرنامج السابق نقوم بإدخال إسم ملف موجود في نفس مكان البرنامج أو بكتابة الإسم كاملاً مثل:

 

/etc/resolv.conf

 

أو

 

/proc/meminfo/proc/cpuinfo

 

بإستخدام أسماء الملفين الأخيرين، فإن هذا البرنامج قادر على قراءة الذاكرة الكلية للحاسوب والذاكرة المستخدمة والذاكرة المتاحة، كذلك يمكنه قراءة نوع المعالج المستخدم في جهاز الحاسوب وسرعته.

 

نلاحظ أننا استخدمنا دوال وإجراءات وأنواع جديدة في هذه البرنامج وهي:

 

1.

 

 

F: TextFile;

 

 

 

وهي تعريف المتغير F بأن نوعه TextFile وهو النوع الذي يتعامل مع الملفات النصية. وفي البرنامج سوف نستخدم هذا المتغيير للتعبير عن الملف الفعلي.

 

2.

 

 

if FileExists(FileName) then

 

 

 

وهي دالة موجودة في المكتبة SysUtils وهي تختبر وجود هذا الإسم كملف، فإذا كان موجود تحقق الشرط وإن لم يكن موجود فإن عبارة else هي التي سوف تُنفّذ.

 

3.

 

 

AssignFile(F, FileName);

 

 

 

بعد التأكد من أن الملف موجود يقوم إجراء AssignFile بربط إسم الملف الفعلي بالمتغير F، والذي عن طريقه يمكننا التعامل مع الملف من داخل باسكال.

 

4.

 

 

Reset(F); // Put file mode for read, file should exist

 

 

 

وهي العبارة التي تقوم بفتح الملف النصي للقراءة فقط، وهي تخبر نظام التشغيل أن هذا الملف محجوز للقراءة، فإذا حاول برنامج آخر فتح الملف للكتابة أو حذفه فإن نظام التشغيل يمنعه برسالة مفادها أن الملف مفتوح بواسطة تطبيق آخر أو أن السماحية غير متوفرة access denied

 

5.

 

 

Readln(F, Line); // Read a line from text file

 

 

 

وهو إجراء القراءة من الملف، حيث أن هذا اﻹجراء يقوم بقراءة سطر واحد فقط من الملف المفتوح F ووضع هذا السطر في المتغير Line.

 

6.

 

 

while not Eof(F) do

 

 

 

كما ذكرنا في اﻹجراء Readln فإنه يقوم بقراءة سطر واحد فقط، وبالنسبة للملف النصي فإننا لايمكننا معرفة كم سطر يحتوي هذا الملف قبل الإنتهاء من قراءته، لذلك إستخدمنا هذه الدالة eof والتي تعني نهاية الملEnd Of File. إستخدمناها مع الحلقة while وذلك للإستمرار في القراءة حتى الوصول إلى نهاية الملف وتحقيق شرط end of file.

 

7.

 

 

CloseFile(F); // Release F and FileName connection

 

 

 

بعد الفراغ من قراءة الملف، يجب إغلاقه وذلك لتحريره من جهة نظام التشغيل حتى يمكن لبرامج أخرى التعامل معه بحرية، ولابد من تنفيذ هذا الإجراء فقط بعد فتح الملف بنجاح بواسطة reset مثلاً. فإذا فشل فتح الملف أصلاً بواسطة reset فلايجب إغلاقه بواسطة CloseFile.

 

 

في المثال التالي سوف نقوم بإنشاء ملف نصي جديد والكتابة فيه:

 

 

برنامج إنشاء وكتابة ملف نصي

var
  FileName: string;
  F: TextFile;
  Line: string;
  ReadyToCreate: Boolean;
  Ans: Char;
  i: Integer;
begin
  Write('Input a new file name: ');
  Readln(FileName);

  // Check if file exists, warn user if it is already exist
  if FileExists(FileName) then
  begin
   
    Write('File already exist, did you want to overwrite it? (y/n)');
    Readln(Ans);
    if upcase(Ans) = 'Y' then
      ReadyToCreate:= True
    else
      ReadyToCreate:= False;
  end
  else // File does not exist
    ReadyToCreate:= True;

  if ReadyToCreate then
  begin
    // Link file variable (F) with physical file (FileName)
    AssignFile(F, FileName);

    Rewrite(F); // Create new file for writing
   
    Writeln('Please input file contents line by line, '
     , 'when you finish write % then press enter');
    i:= 1;
    repeat
      Write('Line # ', i, ':');
      Inc(i);
      Readln(Line);
      if Line <> '%' then
        Writeln(F, Line); // Write line into text file
    until Line = '%';

    CloseFile(F); // Release F and FileName connection, flush buffer
  end
  else // file already exist and user does not want to overwrite it
    Writeln('Doing nothing');
  Write('Press enter key to close..');
  Readln;
end.

 

في البرنامج السابق استخدمنا عدة أشياء وهي:

 

1.

 

 

ReadyToCreate: Boolean;

 

 

 

النوع boolean يمكن لمتغيراته أن تحمل إحدى قيمتين فقط: True/False . وهذه القيم يمكن استخدامها مع عبارة if condition كما في المثال، كذلك يمكن إستخدامها مع حلقة while وحلقة repeat. حيث أن الشرط في النهاية يتحول إلى إحدى هتين القيمتين، فكما في أمثلة سابقة إستخدمنا هذه العبارة:

 

 

 

if Marks > Max then

 

 

 

فهي إما أن تكون النتيجة فيتحول الشرط إلى True أو تكون خاطئة فيتحول الشرط إلى False. فعندما تتحول إلى True يتم تنفيذ الشرط:

 

  if True then

 

وإذا كانت قيمتها النهائية False لاتم تنفيذ إجراء الشرط وإنما يتم تنفيذ إجراء else إن وجد.

 

 

2.

  if upcase(Ans) = 'Y' then

 

هذه العبارة يتم تنفيذها في حالة وجود الملف، فيقوم البرنامج بتنبيه المستخدم بوجود الملف، وسؤاله إذا كان يرغب في حذف محتوياته والكتابة عليه من جديد (overwrite). فإذا قام بإدخال الحرف y صغيرة أو Y كبيرة فإن الشرط يتم تنفيذه في الحالتين، حيث أن الدالة upCase تقوم بتحويل الحرف إلى حرف كبير لمقارنته مع الحرف الكبير 'Y'. أما إذا ادخل المستخدم حرفاً كبيراً Y فإن الدالة upCase لاتقوم بأي تغيير وترجع الحرف كما هو Y.

 

3.

 

 

Rewrite(F); // Create new file for writing

 

 

 

الإجراء Rewrite يقوم بإنشاء ملف جديد أو حذف محتويات الملف إذا كان موجود. كذلك فهو يفتح الملف للكتابة فقط في حالة الملف النصي.

 

4.

 

 

Writeln(F, Line); // Write line into text file

 

 

 

الإجراء Writeln(F يقوم بكتابة المقطع Line في الملف ثم إضافة علامة نهاية السطر وهي CR/LF. وهي عبارة عن رموز الواحد منها يمثل بايت وقيمتها هي كالآتي :

 

 

CR: Carriage Return = 13LF: Line Feed = 10

 

وهذه الرموز من اﻷحرف الغير مرئية، حيث لاتتم كتابتها في الشاشة، إنما يظهر فقط مفعولها، وهي اﻹنتقال إلى سطر جديد.

 

5.

 

 

Inc(i);

 

 

 

يقوم الإجراء Inc بإضافة واحد إلى قيمة المتغير الصحيح، في هذه الحالة i وهو يعادل هذه العبارة:

 

  i:= i + 1;

 

 

6.

 

 

CloseFile(F); // Release F and FileName connection, flush buffer

 

 

 

كما ذكرنا سابقاً فإن الإجراء CloseFile يقوم بإغلاق الملف وإيقاف عملية الكتابة أو القراءة من الملف، وتحريره من الحجز بواسطة نظام التشغيل. إلا أن له وظيفة إضافية في حالة الكتابة. فكما نعلم أن الكتابة على القرص الصلب هي عملية بطيئة نسبياً مقارنة بالكتابة في الذاكرة، مثل إعطاء قيم للمتغيرات، أو الكتابة في مصفوفة. لذلك من غير المنطقي كتابة كل سطر على حده في القرص الصلب أو أي وسيط تخزين آخر، لذلك يقوم البرنامج بتخزين عدد معين من السطور في الذاكرة بعملية تسمى الـ Buffering ، فكلما إستخدمنا عبارة Write أو Writeln لكتابة سطر فإن البرنامج يقوم تلقائياً بكتابته في الذاكرة إلى أن يمتليء هذا الوعاء (Buffer) في الذاكرة فيقوم البرنامج تلقائياً بالكتابة الفعلية على القرص الصلب ثم حذف المحتويات من الذاكرة (Buffer)، وهذه العلمية تسمى Flushing وبهذه الطريقة نضمن السرعة في كتابة الملف، بإعتبار أن التكلفة الزمنية مثلاً لكتابة سطر واحد ربما تساوي تقريباً تكلفة كتابة 10 أسطر في القرص الصلب دفعة واحدة. وتكمن خطورة هذه الطريقة في إنقطاع الطاقة عن الحاسوب قبل الكتابة الفعلية، فيجد المستخدم أن الأسطر الأخيرة التي قام بكتابتها قد ضاعت. ويمكن إجبار البرنامج بالقيام بالكتابة الفعلية على القرص بإستخدام الإجراء Flush، كذلك فإن عملية الـ Flushing تحدث إيضاًعند إغلاق الملف بإستخدام CloseFile.

 

 

 

 

 

الإضافة إلى ملف نصي

 

سوف نقوم في هذا المثال بفتح ملف نصي يحتوي على بيانات ثم إضافة أسطر عليه بدون حذف الأسطر القديمة، ويتم ذلك بإستخدام الإجراء AppendFile

 

 

برنامج الإضافة إلى ملف نصي:

var
  FileName: string;
  F: TextFile;
  Line: string;
  i: Integer;
begin
  Write('Input an existed file name: ');
  Readln(FileName);
  if FileExists(FileName) then
  begin
    // Link file variable (F) with physical file (FileName)
    AssignFile(F, FileName);

    Append(F); // Open file for appending

    Writeln('Please input file contents line by line', 
      'when you finish write % then press enter');
    i:= 1;
    repeat
      Write('Line # ', i, ' append :');
      Inc(i);
      Readln(Line);
      if Line <> '%' then
        Writeln(F, Line); // Write line into text file
    until Line = '%';
    CloseFile(F); // Release F and FileName connection, flush buffer
  end
  else
    Writeln('File does not exist');
  Write('Press enter key to close..');
  Readln;
end.

 

بعد تنفيذ البرنامج يمكننا كتابة إسم ملف نصي موجود وإضافة بضعة أسطر عليه، بعد ذلك يمكننا أن نستعرض الملف عن طريق الأمر cat في لينكس، أو عن طريق تصفح الدليل الذي يوجد فيه البرنامج والضعط عليه بالماوس لفتحه.

 

 

=================================================

الدورة منقولة من كتاب الأستاذ الفاضل معتز عبد العظيم

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

مواضيع مشابهة