the_king
مدیرکل انجمن
دستورات خواندن و نوشتن یک فایل متنی با ساختار ANSI ساده است :
برای نوشتن متن داخل Text1 در درون فایل C:\File.txt این کد را می نویسیم :
برای خواندن محتویات فایل C:\File.txt به درون Text1 این کد را می نویسیم :
البته فراموش نکنید که مشخصه Multiline مربوط به Text1 را True نمایید تا بتواند بیش از یک سطر را
نمایش دهد.
اما من ایندو روتین ساده را پیشنهاد نمی کنم، چون آنها نمی توانند متنهایی که Unicode هستند را به درستی بخوانند
و بنویسند.
متنهای Unicode برای هر کاراکتر از دو بایت حافظه استفاده می کنند و می توانند چندین زبان مختلف را در کنار هم ذخیره کنند.
خود نوع داده String ویژوال بیسیک در حقیقت دارای ساختار Unicode است ولی رابطهای استاندارد ورودی و خروجی آن
نظر CommandButton و Label و TextBox و روتین های کار با فایل بصورت ANSI طراحی شده اند و متن های Unicode
را پس از تبدیل بکار می برند.
پس بهتر است که به جای آن دو روتین استاندارد ذکر شده از این جفت کد زیر استفاده کنیم :
برای نوشتن در یک فایل از این روتین استفاده شود.
پارامتر اول نام فایلی است که قرار است در آن متنی نوشته شود، پارامتر دوم متنی است که قرار است نوشته شود
و پارامتر سوم تعیین می کند که متن بصورت ANSI ذخیره شود و یا Unicode. اگر True باشد بصورت Unicode ذخیره خواهد شد.
مثلا :
برای خواندن محتویات یک فایل متنی از این تابع استفاده شود (هر دو سیستم ANSI و Unicode)
تابع متن فایل را به عنوان مقدار بازگشتی بر می گرداند.
مثلا :
ایندو روتین خطا های دسترسی به فایل را نادیده می گیرند و پیغامی ایجاد نمی کنند.
من بر اساس این دو تابع یک برنامه کامل نوشته ام که می تواند همانند NotePad فایلی را بخواند یا بنویسد.
یک کلاس Browse در این برنامه بکار رفته که برای انتخاب نام فایل ورودی و خروجی بکار می رود.
این کلاس ما را از بکارگیری کنترل ActiveX ای به نام Microsoft Common Dialog Control بی نیاز می سازد.
کد کامل برنامه به همراه فایل اجرایی EXE ضمیمه این پست می باشد.
برای نوشتن متن داخل Text1 در درون فایل C:\File.txt این کد را می نویسیم :
کد:
Open "C:\File.txt" For Output As #1
Print #1, Text1.Text
Close #1
برای خواندن محتویات فایل C:\File.txt به درون Text1 این کد را می نویسیم :
کد:
Dim FileText As String
Open "C:\File.txt" For Binary As #1
FileText = Space(LOF(1))
Get #1, 1, FileText
Text1.Text = FileText
Close #1
البته فراموش نکنید که مشخصه Multiline مربوط به Text1 را True نمایید تا بتواند بیش از یک سطر را
نمایش دهد.
اما من ایندو روتین ساده را پیشنهاد نمی کنم، چون آنها نمی توانند متنهایی که Unicode هستند را به درستی بخوانند
و بنویسند.
متنهای Unicode برای هر کاراکتر از دو بایت حافظه استفاده می کنند و می توانند چندین زبان مختلف را در کنار هم ذخیره کنند.
خود نوع داده String ویژوال بیسیک در حقیقت دارای ساختار Unicode است ولی رابطهای استاندارد ورودی و خروجی آن
نظر CommandButton و Label و TextBox و روتین های کار با فایل بصورت ANSI طراحی شده اند و متن های Unicode
را پس از تبدیل بکار می برند.
پس بهتر است که به جای آن دو روتین استاندارد ذکر شده از این جفت کد زیر استفاده کنیم :
برای نوشتن در یک فایل از این روتین استفاده شود.
کد:
Private Sub SaveFile(ByVal Path As String, ByVal Text As String, Optional ByVal Unicode As Boolean)
Dim Buffer() As Byte
Dim IDCode As Integer
On Error Resume Next
Open Path For Output As #1
Close #1
Open Path For Binary As #1
If Len(Text) > 0 Then
If Unicode Then
IDCode = &HFEFF
Buffer = Text
Put #1, 1, IDCode
Put #1, 3, Buffer
Else
Buffer = StrConv(Text, vbFromUnicode)
Put #1, 1, Buffer
End If
End If
Close #1
End Sub
پارامتر اول نام فایلی است که قرار است در آن متنی نوشته شود، پارامتر دوم متنی است که قرار است نوشته شود
و پارامتر سوم تعیین می کند که متن بصورت ANSI ذخیره شود و یا Unicode. اگر True باشد بصورت Unicode ذخیره خواهد شد.
مثلا :
کد:
SaveFile "C:\File.txt", Text1.Text, True
برای خواندن محتویات یک فایل متنی از این تابع استفاده شود (هر دو سیستم ANSI و Unicode)
تابع متن فایل را به عنوان مقدار بازگشتی بر می گرداند.
کد:
Private Function ReadFile(ByVal Path As String) As String
Dim Buffer() As Byte
Dim IDCode As Integer
On Error Resume Next
Open Path For Binary As #1
If LOF(1) > 0 Then
Get #1, 1, IDCode
If IDCode = &HFEFF Then
If LOF(1) > 2 Then
ReDim Buffer(0 To LOF(1) - 3) As Byte
Get #1, 3, Buffer
ReadFile = Buffer
Else
ReadFile = ""
End If
Else
ReDim Buffer(0 To LOF(1) - 1) As Byte
Get #1, 1, Buffer
ReadFile = StrConv(Buffer, vbUnicode)
End If
Else
ReadFile = ""
End If
Close #1
End Function
مثلا :
کد:
Text1.Text = OpenFile ("C:\File.txt")
ایندو روتین خطا های دسترسی به فایل را نادیده می گیرند و پیغامی ایجاد نمی کنند.
من بر اساس این دو تابع یک برنامه کامل نوشته ام که می تواند همانند NotePad فایلی را بخواند یا بنویسد.
یک کلاس Browse در این برنامه بکار رفته که برای انتخاب نام فایل ورودی و خروجی بکار می رود.
این کلاس ما را از بکارگیری کنترل ActiveX ای به نام Microsoft Common Dialog Control بی نیاز می سازد.
کد کامل برنامه به همراه فایل اجرایی EXE ضمیمه این پست می باشد.