工作需要 我需要使用对文本文件进行读写 *** 作 编程需要完成如下工作
把程序执行错误追加到错误日志中
使巧巧读书网的编辑能够读取错误日志
记得以前使用vb 的时候 对文本文件的 *** 作挺麻烦的 特别是在写文件的时候 需要区分什么顺序文件 随机文件 很教材都专门针对文本文件的读写开辟了一个章节来讲解 够麻烦的了 现在使用 net读写文本文件 因为时间仓促 没来得及细看MSDN 同时受到 的思路影响 把问题复杂化了 在追加记录到文本文件尾部的时候就写不下去了 后来仔细看了一下MSDN中例子 问题终于得到了解决
好了下面进入正题 分别把中对文本文件进行读和写的通用 *** 作做个示例 免得后来新手多走弯路
我们这里是对文件流进行 *** 作 所以模块前面要加上
Imports System IO
写 *** 作
使用System IO的StreamWriter 下面是代码
Dim strFilePath As String = SaveFileDialog FileName
Dim sw As StreamWriter = New StreamWriter(strFilePath True) true是指以追加的方式打开指定文件
For i = To j
temp = i ToString
sw WriteLine(temp)
sw Flush()
Next
sw Close()
sw = Nothing
首先要说明的是构造函数new
Public Sub New(path append Encoding)
path 要打开文件的完整路径 如果文件不存在则自动建立一个新的文件
append 缺省值为false 指示是否以追加方式打开指定文件 false——如果存在path指定的文件 则覆盖原文件 否则建立一个新文件 true——如果存在path指定的文件 则打开该文件 以追加数据的方式在文尾写数据 否则建立一个新文件
Encoding 缺省值为System Text Encoding Default 即使用系统缺省的编码 指示以什么样的编码写文件
WriterLine(str) 在文本中添加一个新行 同时在行尾加上回车换行符
读 *** 作
Dim line As String
Dim sr As StreamReader = New StreamReader(strPath System Text Encoding Default)
Do While sr Peek() >
line = sr ReadLine()
Loop
sr Close()
sr = Nothing
构造函数new
Public Sub New(Path Encoding)
path 要打开文件的完整路径 如果文件抛出一个错误
Encoding 缺省值为System Text Encoding Default 即使用系统缺省的编码 指示以什么样的编码读文件
lishixinzhi/Article/program/net/201311/119731、Open 文件名 [For方式] [Access存取类型] [锁定] AS [#]文件号 [Len=记录长度]
功能:为文件的输入输出分配缓冲区,并确定缓冲区所使用的存取方式
说明:
1)方式:指定文件的输入输出方式,可选,默认是Random,可以是以下值
a、 Output:指定顺序输出方式,将覆盖原有内容
b、 Input:指定顺序输入方式
c、 Append:指定顺序输出方式,在文件未尾追加内容
d、 Random:指定随机存取方式,也是默认方式,在Random方式时,如果没有Access子句,则在执行Open语句时,VB将按下列顺序打开文件:读/写、只读、只写
e、 指定二进制文件。在这种方式下,可以用Get和Put语句对文件中任何字节位置的信息进行读写。在Binary方式中,如果没有Access子句,则打开文件的类型与Random方式相同
2)、存取类型:放在关键字Access之后,用来指定访问文件的类型。可以是下列类型之一
a、 Read:打开只读文件
b、Write:打开只写文件
c、 Read Write:打开读写文件。这种类型只对随机文件、二进制文件及用Append方式打开的文件有效
3)、锁定:该子句只在多用户或多进和环境中使用,用来限制其他用户或其他进程对打开进行读写 *** 作。锁定类型包括:
a、 默认:如不指定锁定类型,则本进程可以多次打开文件进行读写;在文件打开期间,其他进程不能对该文件执行读写 *** 作
b、Lock Shared:任何机器上的任何进程都可以对该文件进行读写 *** 作
c、 Lock Read:不允许其他进程读该 文件。只在没有其他Read存取类型的进程访问该文件时,才允许这种锁定。
d、Lock Write:不允许其他进程写这个文件。只在没有其他Write存取类型的进程访问该文件时,才允许这种锁定
e、 Lock Read Write:不允许其他进程读写这个文件
如果不使用lock子句,则默认为Lock Read write
4)、文件号:由用户自行指定一个由1~511之间的整数,只要该文件号未被使用就合法;打开文件后,可以用该文件号进行读写等 *** 作
5)、记录长度:是一个整型表达式。当选择该参量时,为随机存取文件设置记录长度。对于用随机访问方式打开的文件,该值是记录长度;对于顺序文件,该值是缓冲字符数。”记录长度”不能超过32767字节。对于二进制文件,将忽略Len子句
举例:Open “price.dat” for Output as #1
Open “C:\abc.dat” for radom as #1 len=256
2、Close [#文件号][,#文件号]……:关闭文件
3、Seek #文件号,位置:文件指针跳到指定位置,以字节为单位。取值1~pow(2,31)-1
4、Seek (文件号):返回当前文件指针的位置
5、FreeFile():取得一个未使用的文件号
6、Loc(文件号):返回指定文件的当前读写位置
7、LOF(文件号):返回文件长度
8、EOF(文件号):用来测试文件是否结束,结束返回true
9、Print #文件号,变量1,变量2,…变量n:按顺序将各变量的值写入顺序文件
如果是print #文件号,则写入空行
10、 Write #文件号,表达式表…:作用同 Print
11、 Input #文件号,变量表….:读顺序文件,进行与Print相反的 *** 作
12、 Line Input #文件号,字符串变量:从顺序文件中读入一行
13、 Input$(n,#文件号):从顺序文件读出 n个字符的字符串
14、 Put #文件号,[记录号],变量:把除对象变量和数组变量外的任何变量(包括号含有单个数组元素的下标变量)的内容写入随机文件。
例如:Put #2,,filebuff
15、 Get #文件号,[记录号],变量:读随机文件,执行与put相反的 *** 作
16、 Get|put #文件号,[位置],变量:读写二制文件,位置是指下一次读写 *** 作的位置。
17、 Kill 文件名:删除文件
18、 FileCopy 源文件名,目标文件名:复制文件
19、 Name原文件名 as 新文件名:重命令文件
二进制文件的 *** 作所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,以BMP等图象文件为例,它们的文件头中存放了是何种图形格式、图象大小、调色板等信息,要显示图象时先读取文件头以获得文件的详细信息,然后再按其格式把图象内容显示出来。用二进制方式可以 *** 作任何的文件,当然至关重要的一点是要清楚了解所 *** 作文件的文件头结构。
VB中二进制文件 *** 作主要应用的方法和函数有:Open,Close,Get,Put等。
Open:在For后面的打开模式要用Binary。
Close:关闭文件。
Get:在指定位置取得文件的内容,如果省略位置则从当前位置读取。
Put:在指定位置写入文件,如果省略位置参数就从当前位置写。
下面结合代码讲解二进制文件的 *** 作。
下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的,非常简单,共8个字节(也就是两个长整型的长度),前4个字节存放第一个文件的长度,后4个字节存放第二个文件的长度。为了更直观地表达文件的结构,现假设有两个文件,第一个文件长度是100字节,第二个文件是200字节,那么合并后得到的文件应该是308字节。按顺序来看,文件的结构是:
4第一文件的长度
4第二文件的长度
100第一文件的二进制内容
200第二文件的二进制内容
除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。
‘实现文件的合并
Private
Sub
MergeFile()
Dim
strFileName1
As
String
'第一个文件
Dim
strFileName2
As
String
'第二个文件
Dim
strOutput
As
String
'合并后的文件
Dim
aryContent()
As
Byte
'用来读取文件的数组,每次读取前要重定义
strFileName1
=
"c:\a.bmp"
strFileName2
=
"c:\b.bmp"
strOutput
=
"c:\out.bmp"
'注意下面三个Open语句都是用Binary模式打开的
Open
strOutput
For
Binary
As
#100
Open
strFileName1
For
Binary
As
#1
Open
strFileName2
For
Binary
As
#2
Put
#100,
,
LOF(1)
'取得第一文件的长度,并把它写入到合并文件的文件头中
Put
#100,
,
LOF(2)
'取得第二文件的长度,并写入到合并文件的文件头中
ReDim
aryContent(LOF(1)
-
1)
'重定义数组,为读取文件做准备
Get
#1,
,
aryContent()
'取得第一文件的内容到数组
Put
#100,
,
aryContent()
'把第一文件的内容写到合并文件中
ReDim
aryContent(LOF(2)
-
1)
Get
#2,
,
aryContent()
Put
#100,
,
aryContent()
'关闭文件
Close
#1
Close
#2
Close
#100
End
Sub
‘实现文件的拆分
Private
Sub
SplitFile()
Dim
strFileName1
As
String
Dim
strFileName2
As
String
Dim
strFileSplit
As
String
Dim
aryContent()
As
Byte
Dim
lngLOF(1)
As
Long
'存放从文件头取得的两个文件的长度
strFileName1
=
"c:\a2.bmp"
strFileName2
=
"c:\b2.bmp"
strFileSplit
=
"c:\out.bmp"
Open
strFileSplit
For
Binary
As
#100
Get
#100,
,
lngLOF(0)
'取得第一文件的长度
Get
#100,
,
lngLOF(1)
'第二文件的长度
Open
strFileName1
For
Binary
As
#1
Open
strFileName2
For
Binary
As
#2
ReDim
aryContent(lngLOF(0)-1)
'用第一文件的长度重定义数组,为读取第一文件做准备
Get
#100,
9,
aryContent()
'从第9字节,即文件后面开始读取第一文件的内容
Put
#1,
,
aryContent()
'把取得的内容写入到拆分文件中
ReDim
aryContent(lngLOF(1)-1)
Get
#100,
9
+
lngLOF(0)
+
1,
aryContent()
'从第9字节再加上第一文件的长度处开始读取第二文件的内容,这里可以清楚地看到文件头的作用了
Put
#2,
,
aryContent
Close
#1
Close
#2
Close
#100
MsgBox
"拆分完成。",
vbInformation
文本文件由于没有格式所以它的读写都比较简单和直观,而用二进制 *** 作文件时其实质就是对文件头的理解,如果不知道文件头的结构那就无法对文件进行处理了,知道了文件头所包含的信息后,对文件的 *** 作其实就是按规则进行Get、Put罢了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)