您好,在Visual Basic.NET中,是沒(méi)有像這樣的文件I/O操作的,一般都是通過(guò)System.IO.StreamReader和System.IO.StreamWriter類,System.IO.BinaryReader和System.IO.BinaryWriter類來(lái)讀寫文件以及利用My.Computer.FileSystem類讀寫文件,利用System.IO.Filestream類來(lái)創(chuàng)建文件,通過(guò)引用Microsoft Scripting Runtime來(lái)執(zhí)行文件(夾)和驅(qū)動(dòng)器的特殊操作,常用的是System.IO.StreamReader和System.IO.StreamWriter類。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比惠山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式惠山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋惠山地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
例如說(shuō)要讀取一個(gè)文件,我們可以利用System.IO.StreamReader類編寫一個(gè)方法(也就是函數(shù)),但是首先要在當(dāng)前類的開(kāi)頭添加一個(gè)引用,引用名稱:System.IO,添加引用的代碼如下
Imports System.IO
添加引用之后,就在當(dāng)前類的內(nèi)部創(chuàng)建方法:
Private Function ReadFile(ByVal FileURL As String) As String
Dim sr As StreamReader = New StreamReader(FileURL)
ReadFile = sr.ReadToEnd()
sr.Close()
sr = Nothing
End Function
示例說(shuō)明:
該方法是一個(gè)返回String(字符串)數(shù)據(jù)的函數(shù),F(xiàn)ileURL作為參數(shù)是用來(lái)存放需要訪問(wèn)的文件的URL,當(dāng)然,要獲取一個(gè)文件的URL,就是利用這一句代碼實(shí)現(xiàn)的:
Dim sr As StreamReader = New StreamReader(FileURL)
當(dāng)獲取了URL之后,就要對(duì)文件進(jìn)行讀取操作了,然后將讀取的結(jié)果返回給方法:
ReadFile = sr.ReadToEnd()
讀取文件完畢之后,要對(duì)文件執(zhí)行關(guān)閉操作:
sr.Close()
當(dāng)然別忘了清理資源:
sr = Nothing
StreamReader類可以從流或文件中讀取字符,在創(chuàng)建StreamREader類的對(duì)象時(shí),可以指定一個(gè)流對(duì)象,也可以指定一個(gè)文件URL,創(chuàng)建對(duì)象后就可以調(diào)用他的方法,從流中讀取數(shù)據(jù),其常用方法如下:
Peek:返回下一個(gè)可用字符,但不使用它。
Read:讀取輸入流中下一個(gè)字符或一組字符并移動(dòng)流或文件指針。
ReadBlock:從當(dāng)前流中讀取最大數(shù)量字符并從index開(kāi)始將數(shù)據(jù)寫入buffer。
ReadLine:從當(dāng)前流中讀取一行字符并將字符作為String返回。
REadToEnd:從流的當(dāng)前位置到末尾讀取流。
Close:關(guān)閉打開(kāi)的對(duì)象,釋放資源。
注:流,一種新的數(shù)據(jù)格式,這種格式可通過(guò)System.IO命名空間下的類訪問(wèn)。流用Stream類表示,所有的流都是從這個(gè)類中繼承的。流向用戶提供了一個(gè)一般的數(shù)據(jù)視圖,隱藏了操作系統(tǒng)和底層設(shè)備的實(shí)現(xiàn)細(xì)節(jié),所有的流都支持讀寫操作。在打開(kāi)文件時(shí)將返回對(duì)應(yīng)的流對(duì)象,用戶可以對(duì)流對(duì)象進(jìn)行讀寫操作。
如果要對(duì)文件執(zhí)行按行讀取操作,這時(shí)就會(huì)用到枚舉,這時(shí)候,代碼就要更改一下了:
Private Function ReadFile(ByVal FileURL As String) As String
Dim sr As StreamReader = New StreamReader(FileURL)
For Each fLine As String In sr.ReadToEnd()
Line = sr.ReadLine()
ReadFile = ReadFile fLine
Next sr.ReadLine
sr.Close()
End Function
示例說(shuō)明:
For Each…Next:派生于For…Next循環(huán),用于枚舉一系列對(duì)象中的成員,而這些對(duì)象組成集合,如果集合中至少存在一個(gè)元素,程序就會(huì)靜茹For Each塊執(zhí)行。其格式如下:
For Each 元素 [As 數(shù)據(jù)類型] In 元素集合
[循環(huán)體]
[Exit For]
[循環(huán)體]
Next [元素]
比如:
Dim CountNumber As ULong = 0
Dim FolderName() As String = New String() {" "}
For Each strFolder As String In My.Computer.FileSystem.GetDirectories("C:\")
CountNumber = CountNumber + 1
ReDim Preserve FolderName(1 To CountNumber)
FolderName = strFolder
Next strFolder
注:My.Computer.FileSystem.GetDirectories:主要用來(lái)枚舉指定目錄的子文件夾。
Preserve:主要用來(lái)避免重定義數(shù)組而不損失數(shù)組元素的原有數(shù)據(jù)。
另外,利用My.Computer.FileSystem也可以實(shí)現(xiàn)文件的讀取,其代碼如下:
Dim fpReader As String = My.Computer.FileSystem.ReadAllText("C:\test.txt")
示例說(shuō)明:
定義一個(gè)字符串變量利用My.Computer.FileSystem.ReadAllText來(lái)實(shí)現(xiàn)對(duì)“C:\test.txt”的讀取。
如果是已經(jīng)編碼的文本,則可以使用My.Computer.FileSystem對(duì)象中的ReadAllText方法并提供路徑和文件編碼類型,將文本寫入字符串變量中,例如:
Dim fpReader As String = My.Computer.FileSystem.ReadAllText("C:\test.txt", _
System.Text.Encoding.UTF32)
當(dāng)然,System.Text.Encoding的成員不止一個(gè),它還有如下成員:
System.Text.Encoding.UTF8
System.Text.Encoding.UTF16
System.Text.Encoding.ASCII
System.Text.Encoding.Unicode
這些是常見(jiàn)的成員,也是主要的成員。
另外,利用My.Computer.Filesystem類無(wú)法實(shí)現(xiàn)文件的行操作,還有,如果您的計(jì)算機(jī)未安裝完整的Microsoft.NET Framework Runtime,則無(wú)法實(shí)現(xiàn)這種操作!
寫入文件的操作同樣簡(jiǎn)單,Visual Basic.NET 允許用戶使用StreamWriter來(lái)對(duì)文件寫入內(nèi)容,下面就讓我們來(lái)創(chuàng)建一個(gè)子例程,來(lái)實(shí)現(xiàn)文件的寫入:
Private Sub WriterFile(ByVal FileURL As String, ByVal FileCon As String)
Dim sr As StreamWriter = New StreamWriter(FileURL)
sr.Write(FileCon)
sr.Close()
sr = Nothing
End Sub
示例說(shuō)明:
sr.Write(FileCon):將FileCon寫入文件FileURL之中。
另外,StreamWriter常用方法如下:
WriteLine:向流中寫入一行,后面跟結(jié)束符。
Write:寫入流,向流對(duì)象中寫入字符并移動(dòng)流或文件指針。
Close:關(guān)閉打開(kāi)的對(duì)象,釋放資源。
附:Visual Basic 6.0文件操作解說(shuō):
打開(kāi): Open 文件名 For Input | Output | Append As [#]文件號(hào)
Input打開(kāi)讀入,文件不存在報(bào)錯(cuò)。Output打開(kāi)覆蓋寫入,文件不存在則創(chuàng)建。Append打 開(kāi)追加寫入,文件不存在則創(chuàng)建。
讀: Line Input #文件號(hào), 字符串變量
讀一行數(shù)據(jù)存入字符串變量,數(shù)據(jù)包括空格、Tab、等,不包括回車符和換行符,所以要顯示文件的換行效果,要手動(dòng)添加回車符和換行符(vbCrLf)
Input #文件號(hào), 變量1[, | ;] [變量2]...
這種方式可以存入多個(gè)變量,而且變量類型不限于字符串型。
寫: Print #文件號(hào), 參數(shù)1[, | ;] [參數(shù)2]...
將各參數(shù)逐個(gè)寫入文件。參數(shù)間用逗號(hào)隔開(kāi)時(shí),文件中相應(yīng)插入多個(gè)空格;用分號(hào)隔開(kāi)時(shí),插入一個(gè)空格??梢杂肧pc(n)、Tab(n)等進(jìn)行排版。
Write #文件號(hào), 參數(shù)1[, | ;] [參數(shù)2]...
這種寫入方式將自動(dòng)添加界定符,對(duì)不同參數(shù)的類型加以界定。
Visual Basic 6.0文件操作函數(shù):
Seek: Seek(文件號(hào))
返回文件正在訪問(wèn)的位置,返回值為長(zhǎng)整型。對(duì)順序文件和二進(jìn)制文件,返回值以字節(jié)為單位;對(duì)隨機(jī)訪問(wèn)文件,返回值以記錄號(hào)為單位。
Seek: Seek [#]文件號(hào),位置
定位文件到指定位置。位置單位同上所述。
Input: Input (字節(jié)數(shù),[#]文件號(hào))
從文件的訪問(wèn)當(dāng)前位置讀入指定字節(jié)數(shù)的數(shù)據(jù)。僅適用于順序文件和二進(jìn)制文件。
EOF: EOF(文件號(hào))
判斷文件的訪問(wèn)位置是否在文件尾,如果是,返回True,否則,返回False。
LOF: LOF(文件號(hào))
返回文件長(zhǎng)度,單位為字節(jié)。
FileLen: FileLen (文件名)
返回文件名對(duì)應(yīng)文件的長(zhǎng)度,單位是字節(jié)。該函數(shù)取磁盤文件標(biāo)識(shí)中的長(zhǎng)度,即文件打開(kāi)前的長(zhǎng)度,可以取未打開(kāi)的文件長(zhǎng)度。
GetAttr: GetAttr (Pathname)
返回指定文件或文件夾的屬性。
FileAttr: FileAttr (文件號(hào))
返回文件號(hào)對(duì)應(yīng)文件的打開(kāi)方式。
GetDateTime: GetDateTime (Pathname)
返回文件被創(chuàng)建或修改的最后日期和時(shí)間。
Free: FreeFile[(0|1)]
返回未被占用的文件號(hào),F(xiàn)ree或Free(0)返回1~255之間未占用的文件號(hào),F(xiàn)ree(1)返回256~511之間未占用的文件。
Dir: Dir (Pathname [,Attributes])
測(cè)試指定路徑是否有某文件,Attributes附加文件屬性條件,取值vbNormal、vbReadOnly、vbHidden、vbSystem、vbVolume、vbDirectory。
Kill: Kill (文件名)
刪除指定文件,文件名可包含路徑。
FileCopy: FileCopy 源文件,目標(biāo)文件
拷貝文件。
Name: Name 舊文件名 As 新文件名
文件重命名。前后路徑不一致時(shí),操作為移動(dòng)文件并重命名。
MkDir: MkDir path
新建文件夾。
RmDir: Rmdir path
刪除文件夾。
ChDrive: ChDrive Drive
改變當(dāng)前驅(qū)動(dòng)器 ChDrive "D"
CurDir: CurDir [(driver)]
返回當(dāng)前工作路徑,指定driver則返回目標(biāo)驅(qū)動(dòng)器的當(dāng)前工作路徑。
舉例:
'新建文件,并寫入數(shù)據(jù),關(guān)閉
Open "a.txt" For Output As #1
Print #1, "ABCDEFG"; vbCrLf; "HIJK"
Close #1
'打開(kāi)文件,并全部寫入新文件,關(guān)閉
Open "a.txt" For Input As #2
Open "b.txt" For Output As #3
Dim str As String
While (Not EOF(2))
Line Input #2, str
Print #3, str
Wend
Close
注:關(guān)于Visual Basic 6.0的文件操作資料來(lái)自于
如果您覺(jué)得我的回答幫助了您解決難題,別忘了采納哦,如果我的回答未能解決您的問(wèn)題,您可以在互聯(lián)網(wǎng)上尋找更多的解決方案!
me.dispose是最徹底釋放資源; Me.Close 是關(guān)閉 end 只是結(jié)束 一般用在程序的語(yǔ)句中,如結(jié)束語(yǔ)句。
執(zhí)行 dispose 后,由.net 的GC垃圾回收器周期性地回收資源, me.close 方法的基類會(huì)調(diào)用 dispose 方法end 是從vb中繼承下來(lái)的語(yǔ)句,直接指示退出程序.程序的資源將被釋放,程序并未希望結(jié)束時(shí),不適合使用該方法.若要強(qiáng)行退出應(yīng)用程序,
如果需要講詳細(xì)一點(diǎn),那就加我QQ531412815
第4題,潛在的錯(cuò)誤,這里的錯(cuò)誤不是常規(guī)錯(cuò)誤,屬于那種只有在運(yùn)行是才知道的錯(cuò)誤:
Catch ex As Exception
MsgBox(ex.StackTrace)
'永遠(yuǎn)不會(huì)查找下面的錯(cuò)誤
Catch ex As ArgumentNullException
MsgBox("Input Test box cannot be null.")
Catch ex As OverflowException
MsgBox("Input Test box 2 cannot be zero!")
Catch ex As FormatException
MsgBox("Input Test box should be numeric format!")
結(jié)構(gòu)化錯(cuò)誤處理永遠(yuǎn)達(dá)不到下面這里,因?yàn)镃atch ex As Exception 已經(jīng)處理了所有錯(cuò)誤.
第5題:
00123
1000 60.50
2000 60.00
3500 59.50
---- -----
6500 60.00
00124
3000 60.50
---- -----
3000 60.50
00125
2000 59.50
1000 58.00
---- -----
3000 58.75
就是按照Ref_ID 分類,有一種方法就是按照Ref_ID 分組,也就是使用SQL語(yǔ)言,不過(guò)這里需要該很多,
我就不用了,那么就稍微復(fù)雜一點(diǎn),使用FIND方法,不過(guò)有一點(diǎn)必須注意REF_ID必須排序,因?yàn)閿?shù)據(jù)庫(kù)中
已經(jīng)排好序了,我就不用排了。
Dim rst as ADODB.Recordset
dim refID as string
Rst = GetRecordset
Do While Not rst.EOF
refid=rst(0)
Console.writeline(rst.Fields("Ref_ID")
do
Console.writeline rst.Fields("Qty") vbcrlf rst.Fields("Price"))
rst.MoveNext()
loop while rst(0)=refid
Loop
第6題:就是從一個(gè)集合中取元素輸出的問(wèn)題
比較簡(jiǎn)單的辦法就是使用遞歸
以下是使用VB的方法(可以移植到VB.NET上,因?yàn)槲覍?duì)VB.NET的數(shù)組到現(xiàn)在還不太會(huì),所以就將就一下)
Dim bUse() As Boolean
Dim lStr() As String * 1
Dim nCount As Byte
-----------------------------------------------------------------------------------
Public Sub Combination(lstStr As String)
Dim i As Byte
Dim j As Byte
Dim StrLen As Byte
StrLen = Len(lstStr)
ReDim bUse(1 To StrLen) As Boolean
ReDim lStr(1 To StrLen) As String * 1
For i = 1 To StrLen
lStr(i) = Mid(lstStr, i, 1)
Next
For i = 1 To StrLen
nCount = i
GoWith StrLen, 1, 0, ""
Next
End Sub
------------------------------------------------------------------------------------
Public Sub GoWith(ECount As Byte, nStart As Byte, Deep As Byte, lastStr As String)
Dim i As Byte
If Deep = nCount Then
Debug.Print lastStr
Exit Sub
End If
For i = nStart To ECount
If Not bUse(i) Then
bUse(i) = True
GoWith ECount, i, Deep + 1, lastStr lStr(i)
bUse(i) = False
End If
Next
End Sub
--------------------------------------------------------------------------------------
Private Sub Form_Load()
Combination "wxyz"
End Sub
--------------------------------------------------------------------------------------
其中GOWITH是真正的遞歸函數(shù),而Combination是用來(lái)預(yù)處理字符的
全局變量:
BUSE:用來(lái)確定是否使用過(guò)這個(gè)元素
lSTR:用來(lái)保存字符元素
NCOUNT:用來(lái)限制遞歸函數(shù)的深度,換句話說(shuō),就是輸出元素組中的元素個(gè)數(shù)
實(shí)際測(cè)試成功,另外我對(duì)前三題很感興趣,希望能夠傳給我
我很喜歡這種題目
-------------------------------------------------------------------------
第7題,問(wèn)題出在兩方面
Public Function CalculateArea(ByVal SideBase As Double, ByVal Height As Double, _ Optional
ByVal AssignToArea As Boolean = False) As Double
Dim Area As Double = (SideBase * Height) / 2
中間的 _ 有問(wèn)題,應(yīng)該去掉
還有objShape = CType(objShape, clsTriangle) 有錯(cuò)誤,不能轉(zhuǎn)換
注釋掉objShape = CType(objShape, clsTriangle)
刪除_后,得到結(jié)果
true
false
-330
--------------------------------------------------------------------------
第8題,就是以acc_grp_cust_tbl表為基礎(chǔ),查找cust_tbl并輸出
一般的話使用涉及兩個(gè)表的話使用SHAPE語(yǔ)句(以SQL為基礎(chǔ)的語(yǔ)句)
雖然兩者使用時(shí)差不多,但是理論比較難懂,我這里也不講了,我使用ADO+SQL方法
先說(shuō)明一下程序中的一個(gè)細(xì)節(jié),也是問(wèn)題比較容易忽略的
1400 0 1 2
1500 3 4
1600 5
說(shuō)明一個(gè)問(wèn)題Cust_id1 Cust_id2 Cust_id3 Cust_id4 字段不是數(shù)值,而是類似字符的東西(因?yàn)榭赡苁?/p>
備注)
定義rsgrp對(duì)應(yīng)acc_grp_cust_tbl ,rscust對(duì)應(yīng)cust_tbl
預(yù)先設(shè)置好rsgrp和rscust的連接(使用VB的方法,可以移植到VB.NET上)
do until rscust.eof
strline=rscust(0) " "
strSQL="SELECT * FROM CUST_TBL WHERE cust_id='" RSGRP(1) "' OR CUST_ID='" RSGRP(2) "' OR CUST_ID='" RSGRP(3) "' OR CUST_ID='" RSGRP(4) "'"
RSGRP.OPEN STRSQL
if rsgrp.recordcount0 then
rsgrp.movefirst
do until rsgrp.eof
strLine=strline rscust(3) " " rscust(2) "/"
rsgrp.movenext
loop
end if
rscust.close
strline=left(strline ,len(strline)-1)
'去除最后一個(gè)"/"
console.writeline(strline)
loop
還是用數(shù)組比較好吧,按鈕數(shù)組
然后call Button_Click(5,Nothing, Nothing) 就可以了
按鈕數(shù)組可以先創(chuàng)建一個(gè)按鈕,然后復(fù)制粘貼即可
【1】
New Char()意思是定義一個(gè)新的Char型數(shù)組并將此數(shù)組作為參數(shù)傳遞
基本等同于VB6的Dim tmp() As XXXX
但是此語(yǔ)法要比VB6中的更加靈活
【2】
VB.net中新增了一個(gè)Char類型,用來(lái)存儲(chǔ)Unicode字符,而用引號(hào)""括起來(lái)的字符默認(rèn)為ASCII字符,所以要在引號(hào)后加上一個(gè)小寫的c來(lái)強(qiáng)制VB將字符轉(zhuǎn)換為Unicode編碼。例如:
Dim UniCode As Char,ASCIICode As String
UniCode = "W"c
ASCIICode = "W"
【3】花括號(hào)為初始一個(gè)新數(shù)組時(shí)的語(yǔ)法,括號(hào)中可以用逗號(hào)分隔開(kāi)數(shù)組的初始值。對(duì)比:
VB6:
Dim k() As String
k = Array("a","b","c")
VB.net:
Dim k As String(){"a","b","c"}
而數(shù)組作為參數(shù)傳遞時(shí),在過(guò)程的一開(kāi)始就定義一個(gè)傳遞用的數(shù)組是很麻煩的,
所以用New Char(){ "a"c , "b"c , "c"c }會(huì)很方便
【4】
Split方法有很多重載版本,你所說(shuō)的這一種能夠使用