Visual Basic Online Course - File Handling

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

التعامل مع الملفات من خلال الفيجوال بيزك

معلومه
Bit 8 بت = 1 بايت أو حرف Byte\Character
عدد من البايت أو الحروف = 1 حقل أو متغير نصى Field\String
عدد من المتغيرات النصيه أو الحقول  = 1 سجل Record
عدد من السجلات  = 1 ملف File
عدد من الملفات = 1 قاعدة بيانات DataBase .
و فيما يتعلق بالفيجوال بيزك 6 فان هناك 3 طرق للتعامل مع الملفات و هى :
  • الطريقه النصيه أو التتابعيه Sequential Mode \ Text Mode
  • الطريقه العشوائيه للوصول Random Access Mode
  • الطريقة الثنائيه Binary Mode .
بالنسبه للطريقه النصيه (التتابعيه) فان البيانات Data تخزن و تسترجع على شكل حروف Characters.
أما بالنسبه للأرقام فإنها تخزن و تسترجع على شكل قيم من جدول Ascii .
مثال : عند محاولة تخزين و استرجاع الرقم 17 فانه يخزن و يسترجع على أساس قيمته من جدول Ascii وهو [55 49] .

بالنسيه للطريقه الثنائيه (Binary) فان البيانات Data تكتب و تسترجع على على شكل أرقام .
فالنسبه للرقم 17 فإنه يخزن بشكله و قيمته [17] و الحروف تخزن بقيمتها الرقميه من جدول Ascii .

يظهر فرق كبير بين الملفات النصيه التتابعيه Sequentials و الملفات الثنائيه Binary حيث الملفات التتابعيه و كما فى اسمها فانه يتم القراءه و الكتابه فى الملفات النصيه Text Files بطريقه Sequential أو تتابعيه أى أنه لا يمكن القراءه من "نقطه" معينه من ملف . و الريقه الوحيده لعمل ذلك هى أن تقرأ جميع البيانات حتى تصل الى "النقطه" التى تريد القراءه من بدايتها أو الكتابه من بدايتها .
و لعل أفضل مثال لفهم الملفات التتابعيه هو شريط الكاسيت Cassette Tape حيث انه اذا أردت سماع الشريط من المنتصف (نقطه معينه) فانه يجب عليك سماع الشريط حتى تصل الى المنتصف و بالمثل الـ CD و الـ DVD .
بينما الملفات الثنائيه Binary فانه يمكنك القراءه و الكتابه من أى مكان تريد فى الملف أى أنه يمكنك بداية القراءه أو الكتابه من\الى ملف بداية من النقطه الـ 54 بايت .
الملفات التتابعيه Sequential Files

لكى تفتح ملف بالطريقه التتابعيه فانك تكتب الكود التالى :
Open <FileName> For <Mode> As <#FileNo>
حيث :
FileName هو مسار الملف + اسمه + امتداده مثلا (C:\my_txt\txtfile.txt)
Mode و قد يكون InPut أو OutPut أو Append .
FileNo#  و هو الـ Handle للملف و هو أى رقم من 1 الى 255 يسبقه الرمز # "بمعنى : كما نعرف جيدا أو كما درست فان التعامل مع الكائنات فى بيئة الفيجوال بيزك يكون الـ  Hanlde هو اسم الكائن أو خاصية Name أما عند التعامل مع الويندوز من خلال الفيجوال بيزك فان الـ Handle هو رقم Long للكائن" و هذا ما يمثله FileNo# هو رقم الملف المفتوح كما يعرفه الويندوز" .
و جميع التعاملات مع الملف تتم من خلال الـ Handle .
و يتم فتح الملف التتابعى Sequential بـ 3 طريق كما ذكرنا و هى :
InPut : فتح الملف للقراءه منه.
OutPut : فتح الملف للكتابه فيه .
Append : فتح الملف للكتابه فيه.
اذا كان لدينا ملف باسم Contacts.txt مسجل به بيانات (الاسم) و (رقم الموبيل) مثلا فلكى نستطيع قراءة هذه البيانات فى الفيجوال بيزك :
Open "C:\Contacts.txt" For Input As #1
و بعد الانتهاء من القراءه أو الكتابه يجب اغلاق الملف بالأمر Close أو Close #FileNo حيث اذا لم نذكر FileNo# فان الامر ينطبق على جميع الملفات المفتوحه و لاحظ "اغلاق الملف Hanle Of File أو الـ FileNo# هو شىء ضرورى كى لا تخسر أى بيانات قمت بحفظها فى الملف عند التعامل مع مكتبة الـ IO .

و لنفترض أن ملف Contacts.txt يحتوى على البيانات التاليه :
"Ahmed" , 01002851540
"Mohammed" , 01220982833
"Alaa" , 01119282810
لكى نستطيع قراءة هذه البيانات من الملف Contacts.txt بالطريقه التتابعيه فانه سيتم من خلال قراءة كل سطر على حدى و تخزين السطر فى متغير نصى .. كالتالى :
Dim tmp As String
Open "C:\Contacts.txt" For Input As #1
Line Input #1, tmp
Close #1
MsgBox tmp
ستكون النتيجه فى الـ Message Box كالاتى :

"Ahmed" , 01002851540

حيث قام أمر Line Input بتخزين الملف حتى أول نقطة نهاية (نهاية السطر الأول) فى المتغير tmp .
اذا قمنا باضافة أمر Line Input اخر تحت الأمر الأول فى الكود السابق ستكون النتيجه كالاتى فى الـ Message Box :
"Mohammed" , 01220982833
و بالتالى اذا اردنا القراءة حتى ثانى نقطة نهاية فاننا نكتب الأمر مرتين و هكذا .

الأن سنكتب كود قراءة ملف نصى بالكامل و عرض النتيجه فى Message Box :


Dim Tmp,Contents As String


Open "C:\Contacts.txt" For Input As #1
While EOF(1) =0
Line Input #1, Tmp
Contents = Contents + vbCrLf + Tmp
Wend
Close #1
MsgBox Contents



و ستكون النتيجه عباره عن جميع محتويات الملف معروضه فى الـ Message Box حيث بين كل نقطة نهاية سطر (أو Enter من كايبورد فى الملف) يحدث بالمثل فى الـ Message Box عن طريق vbCrLf و التى تعنى سطر جديد فى عرض البيانات و التى تعمل عمل Enter .

و الداله ()Eof فى الفيجوال بيزك 6 تحدد ماذا كان المؤشر (فى هذه الحاله من داخل الملف النصى) قد وصل الى نهاية الملف أم لا و الصفر فى الداله eof = False و هو يساوى False عموما فى جميع التعاملات مع البيانات من نوع Boolean و (1) تعنى True فيمكنك كتابة أيهما .



لاحظ الاتى : الأمر Line Input لم يفرق بين البيانات النصيه String و هى الأسماء و البيانات الرقميه Intgers و هى أرقام التليفونات .
الان نتعرف على الكتابه فى ملف باستخدام Sequential Mode عن طريق الأمر Write بالخاصيه OutPut و Append .

النظام OutPut : يكتب فى الملف و اذا لم يكن الملف موجود يقوم بانشاه و اذا كان موجود يقوم بتحديثه و الكتابه على محتوياته و بالتالى حذف المحتويات القديمه .

النظام Append : يفعل كل ما يفعله النظام OutPut ماعدا أنه اذا كان الملف المراد الكتابه عليه موجود بالفعل فانه يمكنه (عن طريق المبرمج) اضافة المحتويات الجديده الى الملف فى نهاية الملف .

بعكس الأمر Line Input المستخدم فى قراة الملفات فان الكتابه نستخدم فيها أمران هما Write  و Print .. و يكون شكل الكود كالاتى :
Open "C:\Contacts.txt" For Output As #1
Print #1, "Ahmed Lives In Egypt", 20
Write #1, "Mohammed Lives In Syria", 23
Close #1
End
اذا قمت بتطبيق الكود السابق فانك ستفتح الملف Contacts.txt و لن تجد البيانات السابقه و لكنك ستجد سطرين جديدين هما :
"Ahmed lives in Egypt" , 20
Mohammed lives in Syria           23
استخدام Print : عند استخدام الأمر Print فان ما يحدث فى البرنامج هو بالضبط ما يحدث فى عند التعامل مع الملف مباشرة حيث لم يأخذ فى الاعتبار علامات "" و لا الـ , فقط النص و الأرقام .

استخدام الأمر Write : قام بكتابة العلامات و فرق بين الحقلين بـ علامة , و هو مثل أداء الامر Input فى القراءه و بالتالى اذا أردت قراة ملف بالضبط كما قمت بكتابته فانك تستخدم للكتابه Write و للقراة Input و يمكنك استخدام Print و لكن ستحتاج أكواد اضافيه .

و لكى تقوم بالكتابه فى سطر واحد فان الكود يكون كالتالى :
Write #1,100,"ABC, 1
اما اذا اردت الكتابه سطر بعد سطر فان الكود يكون كالتالى :
Write #1 , 122
Write #1, "ABC"
Write #1, 1
يقوم الأمر Print باضافة مافات Spaces الى النص تختلف بحجم النص نفسه و يصعب التكهن بعددها و كيفية حسابها بعكس Write الذى يفرق بين السجلات "النصوص و الارقام" و ايضا يمكن معرفة طول الملف بالتحديد .

الان نتعرف على الدوال المستخدمه للتعامل مع الملفات فى الفيجوال بيزك ضمن اطار دراسة طريقة Sequential Files أو القراءه التتابعيه .

1) دالة FreeFile : و ظيفتها هى حجز رقم Handle جديد فى الـ Memory للملف المفتوح بمعنى أنه يمكنك استبدال FileNum# بــ FreeFile فى الكود و هو من 1 الى 255 .
Open FileName For Input As FreeFile
و هذا يجنبك تكرار Handle الملف المفتوح فى الذاكره .

2) دالة EOF : وظيفتها تعود بقيمة Boolean تحدد ما اذا الملف المفتوح بالطريقه التتابعيه Sequential وصل لنهايته أم لا .
EOF(File Number) .

3) دالة FileLen : وظيفتها تعود بقيمة Long تساوى طول الملف المفتوح بوحدة قياس نوعها Bytes .
FileLen(Path To File)
و هى تستخدم لمعرفة طول ملف لم يتم فتحه بالأمر Open .

4) دالة LOF : وظيفتها تعود بقيمة Long تحدد طول الملف بوحدة قياس Bytes .
LOF(Path To File)
و هى تستخدم مثل الداله السابقه و لكن مع ملف تم بالفعل فتحة بالامر Open .

5) دالة Seek : وظيفتها تعود بقيمة نوعها Long بوجدة Bytes لملف مفتوح بالأمر Open لتحديد (القراءه\الكتابه) الحاليه لهذا الملف .
Seek(File Number)
تستخدم لمعرفة مكان (القراءه \ الكتابه) بالبايتس Bytes الذى عليه الدور .

أمثله عمليه على Sequential Files

1) معرفة عدد سطور ملف :
Dim counter As Long, tmp As String

counter = 0
Open "C:\Contacts.txt" For Input As #1
While Not EOF(1)
Line Input #1, tmp
counter = counter + 1
Wend
Close #1
MsgBox counter ' Outputs the Number of Lines in a File.
2) حذف سجل من ملف :
قم بانشاء ملف Contacts.txt به القيم التاليه :
"Sanchit", "Karve"

"ABCD", "PQRS"
"Steve", "Jackson"
"XYZ", "DEF"
 
Dim delFirstName As String ' String that contains Record to be Deleted

Dim fName As String, lName as String
delFirstName = "Sanchit"
Open "c:\Contacts.txt" For Input As #1
Open "c:\Contacts.tmp" For Output As #2
While Not EOF(1)

Input #1, fName, lName
If fName <> delFirstName Then
Write #2, fName, lName
End If
Wend
Close #1, #2
Kill ("c:\Contacts.txt") ' Deletes the Original File
Name "c:\Contacts.tmp" As "c:\Contacts.txt" ' Renames the New File


و الى هنا نكون قد انتهينا من الموضوع Sequential Files و انتظروا الجزء الثانى و الثالث Binary Files و Random Files .



كلمه أخيره : اذا كنت تريد حفظ معلومات ستعتمد عليها فى البرنامج كل مره تقوم بفتحه و هذه المعلومات عن برنامجك و هى معلومات ثابته (الطول - النوع - متكرره) أنصحك باحدى طريق التعامل مع الملفات .... أما اذا كانت المعلومات متغيره الطول و النوع و لا يعتمد عليها البرنامج كثيرا (مثل بيانات المستخدم - تسجل مره واحده فقط فى أول مره) فأنصحك باستخدام الـ Regitery .
evry1.net/VB6/

Comments

  1. what's the difference between seek and loc?

    ReplyDelete
  2. Seek :
    Built-in Function, returns (Long) value of an already opened text-file to Set/Get a current (Byte) value by positions. Or, we can say that (Seek) moves the VB 6.0-file-pointer to another
    another position (Byte)
    Syntax :
    Seek #file_number, Byte_Position

    I.E :
    Seek #1, 100
    It means, move to the Byte=100 of the file# 1 'Of course files are consisted of Bytes after all.'

    Loc : is the same as (Seek) ....

    Also, we can define both like this :

    LOC() : *Thanks to Warren Brayshaw for correcting an error*
    DESCRIPTION : Returns a Long representing the read/write position in a file
    opened using the Open statement.

    SYNTAX : LOC(filenumber)
    The required filenumber argument is an Integer containing a
    valid file number.

    USE : LOC() is used to find the current position of the read/write
    pointer in the file.

    Seek() :
    DESCRIPTION : Returns a Long specifying the current read/write position
    within a file opened using the Open statement.

    SYNTAX : Seek(filenumber)
    The required filenumber argument is an Integer containing a
    valid file number.

    USE : Seek() is used to get the Byte Position where the Next
    Operation will take place.

    Was it helpful ?
    Please, share !

    ReplyDelete
  3. Thanks , I've recently been looking for information approximately this topic for a while and
    yours is the best I have found out till now.
    However, what in regards to the bottom line? Are you
    sure concerning the source?

    My homepage ElvinNStriker

    ReplyDelete
  4. I'll right away seize your rss feed as I can't to
    find your email subscription link or newsletter service.
    Do you have any? Kindly permit me recognise in order that I may subscribe.
    Thanks.

    my blog post: BradlyJGiagni

    ReplyDelete

Post a Comment

visual basic 6 source code says (Hi)

VB6 Popular Posts

Visual Basic Online Course - Excel 2003 Part 1

VB 6.0 Crystal Report With MS-Access 2003 - PassWord Problem

Visual Basic Online Course - ListView, Element not found while removing items