ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

بررسی فایل ها در ویژوال بیسیک

 
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET
View previous topic :: View next topic  
Author Message
unknown
مدير بخش ويژوال بيسيك
مدير بخش ويژوال بيسيك


Joined: 05 Dec 2004
Posts: 439
Location: Tehran

PostPosted: Wed Mar 09, 2005 11:00 pm    Post subject: بررسی فایل ها در ویژوال بیسیک Reply with quote

بررسی فایل ها در ویژوال بیسیک:

در بسیاری از برنامه های خود احتیاج به ذخیرهء یکسری اطلاعات برای استفاده های بعدی داریم. این اطلاعات را در فایل ذخیره می کنیم. در vb به راحتی می توانید با فایل ها کار کنید ولی باید چند نکته و اصطلاح کلیدی را دربارهء فایل ها بدانید که به مرور در این بخش با آنها آشنا می شوید.
انواع یا (Mode) های فایل ها در vb:
1. Input
2. Output
3. Append
4. Random
5. Binary
برای ورود اطلاعات یا خواندن اطلاعات از یک فایل از Input استفاده می شود. در این متد قادر به تغییر در محتوای فایل نیستید.
Output یک فایل خالی بر روی هارد ایجاد می کند و به شما اجازه می دهد اطلاعات خود را در آن فایل بنویسید.
Append نیز شبیه Output می باشد. یعنی اگر فایل وجود نداشته باشد آن را ایجاد می کند ولی تفاوت آن با Output در این است که اگر فایل موجود باشد اطلاعات به ادامهء آن فایل اضافه می شود. ولی در Output اگر فایل موجود باشد محتویات آن پاک می شود و محتویات جدید جایگزین آن می شود.
نوع Random هم ترکیبی از خواندن و نوشتن می باشد.
نوع آخر هم که بسیار کاربرد دارد در فایل به صورت Binary کار می شود. به دلیل اهمیت زیاد این نوع در آخر این بخش آن را مفصلا توضیح می دهم.
نکته:
ممکن است درجائی این روش ها با نام فایل های ترتیبی ذکر شوند.چرا؟
این به این دلیل است که "یک بار که از روی یک فایل می خوانید یا روی آن می نویسید نمی توانید به آن برگردید مگر این که آن فایل را یک بار ببندید و دوباره آن را باز کنید. چون همان طوری که بعدا گفته می شود موقعیت فعلی فایل تغییر می یابد (Loc). به عبارت دیگر این روش ها یک طرفه یا ترتیبی اند."
خوب حالا که با این متد ها آشنا شدید به توضیح نحوهء ایجاد فایل ها می پردازم:
در vb تمام این عملیات با یک دستور Open انجام می شود:

Open StrFileName For fMode As #intFileNumber


StrFileName رشته ای می باشد که آدرس و پسوند فایل را در هارد مشخص می کند.
مثلا:

StrFileName = “C:\Test1.txt”
StrFileName = “D:\Files\newTest.dat”

fMode روش باز کردن فایل را نشان می دهد که باید یکی از مقادیر بالا باشد (Input,Output…)
intFileNumber شمارهء فایل می باشد. هنگام کار با فایل ها در vb به هر فایلی که باز می کنیم یک شماره اختصاص می دهیم (1 تا 255) و از این به بعد با این شماره کار می کنیم. این شماره نمایندهء آن فایل باز می باشد.
توجه:
فایلی را که باز می کنید پس از پایان کارتان حتما باید ببندید. این کار با دستور Close انجام می شود.

Close [intFileNumber1, intFileNumber2,…]

اگر Close را بدون ذکر شمارهء فایل مورد نظر به کار ببرید تمام فایل های باز توسط برنامه بسته می شوند.

Close

مثال:

Close 1, 3

این دستور دو فایل باز 1 و 3 را می بندد.

Open "C:\test.txt" For Output As #1

Close 1


با استفاده از دستورات بالا یک فایل متنی خالی در درایو C: ایجاد می شود.
خوب فایل خالی به درد من نمی خورد. من باید بتوانم درون آن بنویسم!
برای نوشتن در فایل باز دو دستور وجود دارد:
1.Print :

Print #filenumber, expression


Filenumber شمارهء فایلی است که می خواهیم توی آن بنویسیم.
نکته:
اگر شماره فایل را به صورت عدد (نه با متغییر) می نویسید وجود number sign الزامی است.(#)
Expression آن عبارتی است که می خواهیم در فایل بنویسیم.

Open "c:\test.txt" For Output As #1
Print #1, "Amir"
Close 1


مثلا دستورات بالا کلمهء Amir را در فایل "c:\test.txt" می نویسد.
امتحان کنید...
توجه داشته باشید که با هر بار دستور پرینت آن عبارت در یک خط نوشته می شود. اصولا کار با فایل ها در vb خطی است.

2.Write :

Write #filenumber, expression


دستور Write هم مثل Print عمل می کند ولی هنگام نوشتن آن عبارت را درون دو علامت نقل قول قرار می دهد. مثال بالا را با Write اجرا کنید تا تفاوت را ببینید. همچنین با این دستور می توان مقادیر را با استفاده از کاما جدا کرد.

درس ذخیره و بازیابی اطلاعات را به یاد بیاورید. تا این قسمت ما فقط اطلاعاتمان را ذخیره کردیم. خوب آیا احتیاجی به بازیابی آن اطلاعات نداریم؟
برای خواندن یک خط از یک فایل از دستور زیر استفاده می شود:

 Line Input #filenumber, variablelist

باز هم filenumber شمارهء فایل باز می باشد (این فایل باید برای خواندن یا Input باز شده باشد)
Variablelist نیز یک متغییر است از نوع رشته برای ذخیرهء خط مورد نظر.(چون اطلاعات به صورت رشته نوشته یا خوانده می شوند)
مثال:

Private Sub Form_Load()
Dim fData As String
Open "c:\test.txt" For Input As #1
    Line Input #1, fData
Close 1
MsgBox fData
End Sub

این تکه برنامه هنگام اجرای برنامه اولین خط از فایل موجود در آدرس "c:\test.txt" را در متغییر fData قرار می دهد و آن را به صورت یک پیغام نشان می دهد. اگر فایل در آدرس مشخص شده وجود نداشته باشد خطای زمان اجرا (Run-Time Error) پیش می آید.
البته بعد ها ما از این خطا برای تشخیص وجود یا عدم وجود یک فایل روی هارد استفاده می کنیم.
البته اگر در دستور خواندن از فایل کلمهء line را حذف کنیم فقط مقادیری را می خواند که قبل از اولین کاما باشند. البته فقط در یک خط. تصور کنید در فایل خطوط زیر نوشته شده:

Hello,World!
Are you there?

خوب اگر برای خواندن از دستور Input بدون Line استفاده شود:

Input #1, fData


فقط عبارت Hello در متغییر fData قرار می گیرد.
خوب همان طور که دیدید با این دستور فقط می توان یک خط از فایل را خواند. برای خواندن تمامی خطوط فایل اول باید انتهای فایل مشخص باشد.در vb تابعی منطقی وجود دارد که هرگاه به انتهای فایل برسیم ارزش درستی را برمی گرداند.

Function EOF(FileNumber As Integer) As Boolean


پس برای خواندن کل فایل باید تا وقتی که به انتهای آن نرسیده ایم عمل خواندن خط به خط را ادامه دهیم. این کار با یک حلقهء تکرار شبیه سازی می شود.
مثال:
ساختن برنامهء NotePad:
خواندن محتویات یک فایل و قرار دادن آن در یک جعبهء متن (همان کاری که NotePad هنگام open کردن فایل ها انجام می دهد.)

برای درست کردن این مثال یک پروژهء Standard EXE را باز کنید.سپس روی فرم یک جعبه متن نسبتا بزرگ قراردهید و خواص MultiLine را برابر True و ScrollBars را برابر 3 قرار دهید(این دو کار الزامی است)
سپس دکمه ای برای Open کردن فایل روی فرم قرار دهید و کد زیر را برای آن بنویسید:

Private Sub mnuOpen_Click()
On Error GoTo Err_Not_Found

Dim FileName, Temp, Total As String
Dim FileNumber As Integer
FileName = InputBox("Enter the path for a text file", _
    "Open", "C:\test.txt", 0, 0)
If FileName = "" Then Exit Sub
FileNumber = FreeFile

Open FileName For Input As FileNumber
    While Not EOF(FileNumber)
        Line Input #FileNumber, Temp
        Total = Total + Temp + Chr(10) + Chr(13)
    Wend
Close FileNumber
Text1.Text = Total
Exit Sub
Err_Not_Found:
MsgBox Err.Description & vbCrLf & Err.Number
End Sub

FileName آدرس فایلی می باشد که می خواهید باز کنید.
FreeFile یک تابع است که شمارهء اولین فایل خالی را بر می گرداند.
در این برنامه با استفاده ار دستور Open فایل را برای خواندن باز می کنیم و با استفاده از یک حلقه خط به خط فایل را خوانده و آن خط را در متغییر Temp قرار می دهیم. سپس هر خط را به متغییر Total اضافه می کنیم و با استفاده از Chr(10) + Chr(13) مکان نما را به خط بعد می بریم. به جای این که Carriage-return/Linefeed را به صورت کدهای اسکی به کار ببریم می توان از ثابتی که در vb برای این کار تعبیه شده استفاده کرد.

vbCrLf


استفاده از این ثوابت vb خوانائی برنامه را بالا می برد.
همچنین در این برنامه از دستور جالب On Error استفاده شده است.
اگراین دستور را در بالای رویه یا تابع خود بنویسید آنگاه برنامه را اجرا کنید و به خطای زمان اجرا برخورد کنید می توانید آن خطا را کنترل کنید و از Crash برنامه های خود جلوگیری کنید.چگونه؟!

On Error Resume Next


اگر در برنامه خطا ایجاد شود بدون در نظر گرفتن آن کنترل برنامه خط بعد از خطا را اجرا می کند و به همین ترتیب تا آخر...

On Error GoTo label


اگر خطا رخ دهد کنترل برنامه به label تعیین شده می رود:

Private Sub Form_Load()
On Error GoTo label
دستورات برنامه     
label:
   دستورات کنترل خطا
End Sub

تابع Err:
اگر خطا رخ دهد این تابع به سادگی جزئیات آن تابع را در اختیار برنامه نویس می گزارد. مثلا در برنامهء بالا هنگام ایجاد خطا توضیح و شمارهء خطا به صورت پیغام به کاربر نمایش می دهد.

البته در مورد کنترل خطا در vb یک پست کامل لازم است که در اولین فرصت پست می شود پس تا همین جا کافی است.

دستورات زیر برای ذخیرهء متن ها (فایل ها) روی هارد استفاده می شود.

Private Sub mnuSave_Click()
On Error GoTo Err_Found
Dim FileName As String
Dim FileNumber As Integer
FileName = InputBox("Enter the path for a text file to save", _
    "Open", "C:\test.txt", 0, 0)
If FileName = "" Then Exit Sub
FileNumber = FreeFile

Open FileName For Output As FileNumber
    Print #FileNumber, Text1.Text
Close FileNumber
Exit Sub

Err_Found:
MsgBox Err.Description & vbCrLf & Err.Number
End Sub

تابع Loc:

Function Loc(FileNumber As Integer) As Long


تابع Locate موقعیت فعلی Read/Write (خواندن یا نوشتن) را درون یک فایل باز برمی گرداند. از این تابع بیشتر در روش Binary استفاده می شود.

تابع Input:

Function Input$(Number As Long, FileNumber As Integer) As String

Number طول فایل را مشخص می کند.
این تابع تقریبا شبیه تابع Line Input می باشد ولی بدون محدودیت.با استفاده از این تابع و تابع LOF که توضیح داده می شود می توان به سادگی کل فایل را بدون استفاده از حلقه خواند. بنابراین کل حلقهء بالا را می توان با دستور زیر جایگزین کرد:

Open FileName For Input As FileNumber
Text1.Text = Input$(LOF(FileNumber), FileNumber)
Close FileNumber

تابع LOF:

Function LOF(FileNumber As Integer) As Long


این تابع (Length Of File) طول فایل مورد نظر را برمی گرداند.

باز کردن فایل ها به طریق باینری:
اکثر اوقات به دلایل زیادی مثل بالا بردن سرعت از طریق باینری فایل های خود را برای پردازش باز می کنیم. اگر تنها فایل را به طریقهء Binary باز کنیم عمل خواندن و نوشتن را همزمان می توان انجام داد. یکی از خصوصیات جالب متد باینری این است که می توان آن را محدود به فقط خواندن یا فقط نوشتن کرد. ممکن است الان به این نکته اهمیت ندهید ولی اکثر اوقات برای نوشتن برنامه های کاربردی باید به این نکات توجه شود.

Open FileName For Binary [Access Read/Write] As #intFileNumber

برای راحتی کار شما همان مثال بالا را با روش باینری شبیه سازی می کنم:

Private Sub mnuOpen_Click()
On Error GoTo Err_Found
Dim Temp As String
Dim FileNumber As Integer

FileName = InputBox("Enter the path for a text file to open", _
    "Open", "C:\test.txt", 0, 0)
If FileName = "" Then Exit Sub
FileNumber = FreeFile

Open FileName For Binary As FileNumber
    Temp = Space$(LOF(FileNumber))
    Get #FileNumber, , Temp
Close FileNumber
Text1.Text = Temp
Exit Sub
Err_Found:
MsgBox Err.Description & vbCrLf & Err.Number
End Sub

برای خواندن از این طریق شما به متغییری نیاز دارید که به اندازهء طول آن فایل در آن متغییر فضای خالی در نظر گرفته شده باشد. این کار توسط تابع Space انجام می شود.

Function Space$(Number As Long) As String

بعد از این که فضای خالی را در متغییرتان در نظر گرفتید می توانید آن را با محتویات فایل با استفاده از دستور Get پر کنید.

با استفاده از دستور Put نیز می توانید مقداری را در فایل به صورت باینری بنویسید.

Put #FileNumber, , Expression


تابع Seek:

با استفاده از این تابع می توانید به جائی از فایل که دوست دارید بروید

Function Seek(FileNumber As Integer) As Long


تابع FileLen:
این تابع طول قایل را برحسب بایت برمی گرداند

Function FileLen(PathName As String) As Long


مثال:
برای این کار احتیاجی به باز کردن فایل ندارید فقط کافی است آدرس آن فایل را بنویسید. بنابراین می توانید برنامهء بالا را نیز به صورت زیر بنویسید:


Temp = Space$(FileLen(FileName))

خوب حالا که با ایجاد فایل ها آشنا شدید با نحوهء پاک کردن آنها (Delete) نیز آشنا شوید.

تابع Kill:

Sub Kill(PathName)

این رویه فایلی را که آدرس آن مشخص است را Delete می کند.مثال:

Kill “C:\test.txt”

تابع FileCopy:
این رویه فایلی را از جائی به جای دیگر کپی می کند

Sub FileCopy(Source As String, Destination As String)

مثال:

FileCopy “C:\test.txt” , “D:\New\1.txt”

نکته:
هیچگاه فایل های سیستم را دستکاری که نه حتی باز هم نکنید چه برسد به سعی در پاک کردن آنها.


در بسیاری از برنامه هایتان با فایل ها و بانک های اطلاعاتی کار می کنید. البته وحید جان زحمت یکسری از مفاهیم اولیهء بانک اطلاعاتی را کشیده و من هم در وقتش به کار با بانک اطلاعاتی می پردازم. ولی کار با فایل ها خیلی آسانتر و پر کاربردتر می باشد.
مثال جالب:
تشخیص وجود یا عدم وجود یک فایل در هارد:
این تابع تابع فوق العاده پر کاربردی است و از چند طرسق نوشته می شود.من چند نوع را برایتان می نویسم که همگی اگر فایل موجود باشد ارزش درستی و در غیر این صورت ارزش نادرستی را برمی گردانند.

Public Function FileExists(filename As String) As Boolean
    FileExists = (Dir(filename, vbNormal Or vbReadOnly Or vbHidden Or vbSystem Or vbArchive) <> "")
End Function

Function FileExists(filename$) As Boolean
Dim f%
   ' Trap any errors that may occur
   On Error Resume Next
   ' Get a free file handle to avoid using a file handle already in use
   f% = FreeFile
   ' Open the file for reading
   Open filename$ For Input As #f%
   ' Close it
   Close #f%
   ' If there was an error, Err will be <> 0. In that case, we return False
   FileExists = Not (Err <> 0)
End Function

Public Function FileExists(TheFileName As String) As Boolean
'Sees if the string(file) you specified exists
If Len(TheFileName$) = 0 Then
    FileExists = False
    Exit Function
End If
If Len(Dir$(TheFileName$)) Then
    FileExists = True
Else
    FileExists = False
End If
End Function

Function fileexists(ByVal sFileName As String) As Boolean
Dim TheFileLength As Integer
On Error Resume Next
TheFileLength = Len(Dir$(sFileName))
If Err Or TheFileLength = 0 Then
    fileexists = False
Else
    fileexists = True
End If
End Function

پس همان طور که می بینید یک برنامهء ساده را به چند طریق می توان نوشت و لی باید بهترین،درست ترین و کوتاه ترین راه را انتخاب کرد.


مولف:
امیر مرادآبادی (amirmoradabadi@yahoo.com)
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum