unknown مدير بخش ويژوال بيسيك
Joined: 05 Dec 2004 Posts: 439 Location: Tehran
|
Posted: Wed Mar 09, 2005 11:00 pm Post subject: بررسی فایل ها در ویژوال بیسیک |
|
|
بررسی فایل ها در ویژوال بیسیک:
در بسیاری از برنامه های خود احتیاج به ذخیرهء یکسری اطلاعات برای استفاده های بعدی داریم. این اطلاعات را در فایل ذخیره می کنیم. در 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 را بدون ذکر شمارهء فایل مورد نظر به کار ببرید تمام فایل های باز توسط برنامه بسته می شوند.
مثال:
این دستور دو فایل باز 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 استفاده شود:
فقط عبارت 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 برای این کار تعبیه شده استفاده کرد.
استفاده از این ثوابت vb خوانائی برنامه را بالا می برد.
همچنین در این برنامه از دستور جالب On Error استفاده شده است.
اگراین دستور را در بالای رویه یا تابع خود بنویسید آنگاه برنامه را اجرا کنید و به خطای زمان اجرا برخورد کنید می توانید آن خطا را کنترل کنید و از Crash برنامه های خود جلوگیری کنید.چگونه؟!
اگر در برنامه خطا ایجاد شود بدون در نظر گرفتن آن کنترل برنامه خط بعد از خطا را اجرا می کند و به همین ترتیب تا آخر...
اگر خطا رخ دهد کنترل برنامه به 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:
این رویه فایلی را که آدرس آن مشخص است را Delete می کند.مثال:
تابع 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) |
|