顺序文件,随机文件,二进制文件操作(vb)

来源:互联网 发布:竞价数据分析思路 编辑:程序博客网 时间:2024/05/29 07:22

   当时是大二···参加个天翼杯软件设计-_- 得了优胜奖 杯具~

   用VB写个类似USB加密狗的东西···要操作文件,所以就有这篇东西了··

 

---------------

   最近在研究异或加密,虽说是最简单的文件加密方法,不过那个二进制的文件操作要上手搞清楚还不是那么简单的,刚开始还真被难到了,有些命令根本看不懂```后来还好上网了解了一下``

         Vb```以后还是投奔去delphi好熟手点,怎么说也是教过差不多一年小学生pascal的-_-``` 找了些关于二进制的文件操作的资料,觉得里面说得还算细的了,一时间熟记有点困难,边学边记··分享一下···

(一)打开和关闭文件   
  1、顺序文件   
  打开顺序文件,我们可以使用Open语句。它的格式如下:   
Open   pathname   For   [Input   |Output   |Append]   As   [#]filenumber   [Len   =   buffersize]     
  说明:   
  (1)参数pathname   表示要打开的文件名,文件名可以包含有驱动器和目录   
  (2)Input   Output   和Append用于设置顺序文件的打开方式。其中,Input表示从打开的文件中读取数据。以这种方式打开文件时,文件必须存在,否则会产生错误。Output表示向打开的文件中写入数据。以这种方式打开文件时,文件中原有的数据将被覆盖,新的数据将从文件开始写入。如果文件不存在,则创建一个新文件。Append表示向打开的文件中添加数据。以这种方式打开时,文件中原有的数据将被保留,新的数据将从文件为开始添加。如果文件不存在,则创建一个新文件。   
  (3)As[#]filenumber   子句用于为打开的文件指定文件号.对文件进行读写操作时,要用文件号表示该文件.文件号是介于1~511之间的整数,既可以是数字,又可以是变量.也可以省略不用.   
  (4)当在文件与程序之间拷贝数据时,Len=buffersize子句指定缓冲区的字符数.   
  例如:   
Open   App.Path   +   "/test.dat"   For   Output   As   1   
Open   App.Path   +   "/test.dat"   For   Output   As   1     
  这两句代码在当前应用程序所在目录下创建了一个名为test.dat的文本文件,分配文件号为1.   
Open   App.Path   +   "/test.dat"   For   Input   As   [#]filenumber     
  这条语句是从文本文件中读取数据.   
Open   App.Path   +   "/test.dat"   For   Append   As   [#]filenumber     
  这条语句则是像文本文件中添加数据


  2、随机文件 
  操作随机文件之前,首先必须定义用于保存数据项的记录类型.该记录是用户自定义数据类型,他们是随机文件中存储数据的基本结构.例如:   
Type   Student   
 No   As   Integer   
 Name   As   String   *   20   
 age   As   Integer   
End   Type   
Dim   Stud   As   Student   ‘定义一个可以存放学生材料的变量    
  随机文件中,所有的数据都将保存到若干个结构为Student类型的记录中,   而从随机文件中读出的数据则可以存放到变量Stud中.   
  之后我们就可以打开并读写文件了.下面是打开随机文件的语法格式:   
Open   filename   For   Random   as   [#]filenumber   Len   =   Reclength     
  说明:   
  (1)参数filename   和filenumber   分别表示文件名或文件号.   
  (2)关键字Random   表示打开的是随机文件 
  (3)Len子句用于设置记录长度,长度由参数Reclength指定.Reclength的值必须大于0,而且必须与定义的记录结构的长度一致.计算记录长度的方法是将记录结构中每个元素的长度相加.例如前面声明的Student的长度应该是2+20+2=24字节.   
  打开一个记录类型为Student   的随机文件的方法是:   
Open   "c:/Student.txt   "   For   Random   As   #1   Len   =   25    

 


  3、二进制文件   
  打开二进制文件的语法格式如下:   
Open   pathname   For   Binary   As   [#]filenumber     
  说明:

(1)   参数filename   和filenumber   分别表示文件名或文件号.   
  (2)关键字Binary   表示打开的是二进制文件 
  (3)对于二进制文件,不能指定字节长度.每个打开的二进制文件都有一个自己的指针,文件指针是一个数字值,指向下一次读写操作的文件中的位置.二进制文件中的每个”位置”对应一个数据字节,因此,有n个字节的文件,就有1到n个位置.   
  我们可以用Seek()函数返回当前的文件指针位置(即下一个要读写的字节   );用Loc()函数返回上一次读写的字节位置,除非用Seek语句移动了指针,Loc()返回值总比Seek()的小1.我们来看下面的例子:   
Open   “student.txt”   for   Binary   as   #1     
  该语句用二进制的方式打开了student.txt文件.

(二)读文件 
  1、顺序文件
 
  顺序文件的读取有三种方式:   
  (1)Line   Input   #   语句 
  该语句从打开的顺序文件中读取一行数据。这里的一行指的是从当前指针位置开始到回车符或回车换行符之间的所有数据。Line   Input   #   语句的语法格式如下:   
Line   Input   #   文件号,变量号    
  说明:“文件号”是打开文件时所用的文件号;“变量号”使用来存放读出数据的一个或多个变量,如果有多个变量,中间用空格分割开。Input#   语句为参数列表中的每一个变量读取文件的一个域,并将读出的域存入变量中。该语句只能顺序的从第一个域开始,直到读取想要的域。 
  请看下面代码:   
Dim   strLine   As   String   
Open   "c:/vb/test.txt"   For   Input   As   #1   
Do   Until   EOF(1)   
 Line   Input   #1,   strLine   
 text1.Text   =   text1.Text   +   strLine   +   Chr(13)   +   Chr(10)   
Loop   
Close   #1     
  此段代码逐行读取一个文件到文本框中。 
  (2)Input函数 
  此函数可以从顺序文件中一次读取指定长度的字符串。具体地说,就是从文件的当前位置开始,读取指定个数的字符,然后将他们返回。Input函数可以读取包括换行符,回车符,空格符等在内的各种字符。下面是它的语法格式:   
  变量   =   Input(串长度,文件号) 
  例如,要从一个打开文件中读取12个字符并复制到变量file中,我们可以这样写:   
file   =   Input(12,filenum)    
  如果要将整个文件复制到变量,请使用InputB函数将字节从文件复制到变量。由于InputB函数返回一个ASCII字符串,因此,必须用StrCopy函数将ASCII字符串转换为Unicode字符串。代码如下:   
file   =   StrCopy   (Input   (LOF(filenanum),filenum),vbUnicode) 
  (3)Input   #   语句 
  Input   #语句可以从文件中同时向多个变量内读入数据,而且读入的数据可以是不同类型的。   
    
  下面使它的语法格式:   
Input   #   文件号,变量列表    
  例如,我们要在文件student.txt中写入数据,下面是代码: 
Open   "student.txt"   For   Output   As   #filenum   
Write   #filenum,   "张三",   "初一年级",   14   
Write   #filenum,   "李四",   "职业高中",   18   
    
Dim   name   As   String,   nianji   As   String,   age   As   Integer   
Dim   name1   As   String,   nianji1   As   String,   age1   As   Integer   
Open   "student.txt"   For   Input   As   #filenum   
Input   #filenum,   name,   nianji,   age   
Input   #filenum,   name1,   nianji1,   age1   
Close   #filenum     
  执行结果:   
name=”张三”   ,nianji   =   “初一年级”   ,age   =14     
name=”李四”   ,nianji   =   “职业高中”   ,age   =18      


  2、随机文件 
  读取随机文件是可以使用Get   #   语句,数据从文件的一个指定记录中读出后,存入一个用户自定义的变量中.   
  语法格式:   Get   #   FileNum   ,[RecNum],UserType   
  说明:   
  (1)FileNum   是要打开的文件号;RecNum是要读取的记录号,若省略,则读取下一个记录 
  (2)UserType   是一个用来存放读出数据的用户自定义的数据类型变量.   
  下面是一个例子:   
Get   #   1,5,Student       
  该语句读取文件号为1的文件中的第5条记录.  


  3、二进制文件 
  读写二进制文件的方法和读写随机文件的方法基本相同,下面是相关的语句格式及其说明:   
  格式:   Get   [#]fileNumber   ,[Pos],   Var   
  功能:   用二进制方式,从文件的中指定的位置开始读取,所给变量长度的数据 
  说明:   
  (1)FileNumber是以二进制方式打开的文件号.   
  (2)Pos用来指定读写操作发生时的字节位置,若省略,则使用当前文件指针位置.   
  (3)Var是用来存放读出的数据的变量.该语句会自动根据var变量包含的字节长度读取适当的文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.对于文件长度的判断我们可以使用Lof()函数,Eof()函数检查文件的结尾位置.   
  下面的代码复制studert.txt文件到student1.txt文件中 
Dim   ar   As   String   *   1,   i   As   Integer   
Open   "c:/student.txt"   For   Binary   As   #1   
Open   "c:/student2.txt"   For   Binary   As   #2   
For   i   =   1   To   LOF(1)   
 Get   #1,   ,   ar   
 Put   #2,   ,   ar   
Next   i   
Close   #1,   #2

(三)写文件 
  1、   顺序文件
 
  写顺序文件我们可以用Write   #   和Print   #语句向一个已经打开的文件中写入数据.   
  下面是他们的格式和说明:   
  Print   #   的语法格式:   
  Print   #   文件号,变量列表 
  例如,将文本框中的文本写到文件中,代码如下:   
Open   "file.txt"   For   Output   As   #filenum   
Input   #filenum,   text1.text     
  Write   #   语句的语法格式:   
Write   #   文件号,变量列表    
  说明:用Write   #   语句写入的信息便于以后用Input   #语句来读取数据,因为Write   #语句自动将写入到文件中的信息用逗号分开,并为字符串数据加上双引号.例如:   
Open   "student.txt"   For   Output   As   #filenum   
Write   #filenum,   "张三",   "初一年级",   14   
Write   #filenum,   "李四",   "职业高中",   18    


  2、   随机文件 
  向随机文件中写入数据,使用Put #语句.语法格式如下:   
Put   [#]   FileNum   ,[RecNum],UserType     
  说明:   
  (1)   FileNum   是要打开的文件号;RecNum是要写入的记录号,若省略,则再上一次用Get   和Put语句所读写过的记录的后一条记录中写入,如果没有执行过Get   和Put语句,就从第一条记录开始 
  (2)UserType   是包含要写入数据的用户自定义的数据类型变量.例如:我们向前面的student.txt文件中的第5个记录写入数据,可用这些语句:   
stud.No   =   0301   
stud.Name   =   “王武”   
stud.Age   =20   
Put   #1   ,5,stud     
  如果要插入的数据不只一两条的话,首先要确定文件和每条记录的长度,这样就可以计算出文件中究竟有多少条记录.我们可以用Lof()函数返回文件的长度,Len()函数返回每个记录的长度,计算文件中的记录个数可以用文件的长度除以给个记录的长度.示例如下:   
Nextrec=   (Lof(1)/Len(UserType))+1   
Put   #1,Nextrec,UserType    


  3、二进制文件 
  下面是以二进制方式写入文件的语句格式及其说明:   
  格式:   
Put   [#]fileNumber   ,[Pos],   Var     
  功能:   用二进制方式,从文件的中指定的位置开始写入,所给变量长度的数据 
  说明:   
  (1)FileNumber是以二进制方式打开的文件号.   
  (2)Pos用来指定写操作发生时的字节位置,若省略,则使用当前文件指针位置.   
  (3)Var是用来存放写入的数据的变量.该语句会自动根据var变量包含的字节长度写入文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.   
  使用方法可参考二进制文件的读操作。

   二进制文件的操作

所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,以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:/.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:/2.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罢了。