加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

VB备忘录(14)文件读取

发布时间:2020-12-17 08:16:59 所属栏目:百科 来源:网络整理
导读:记录文件 域,域名,域值 顺序文件:只能按顺序进行读取,不能随意定位进行读

记录文件

域,域名,域值


顺序文件:只能按顺序进行读取,不能随意定位进行读取。仅适合于小容量文件

随机文件:按记录读取,可以随机定位,读取速度快,对大容量记录文件效率最高

二进制文件:以字节进行顺序存储,可定位操作




内存---------》硬盘 输出到硬盘(Output)

内存《--------硬盘 读进内存(Input)




文件操作三步:

1、打开文件 open

2、操作文件

3、关闭文件 close


===========================================================================================================


顺序文件

只能按照从前到后的顺序操作文件。


打开顺序文件

Open filename For [Input | Output | Append ] [lock] As filenumber [len=buffersize]

读入内存Input,若无该文件,将产生错误

输出Output,覆盖写入,Append是在尾部追加写入。若无该文件,将新创一个文件。


读入数据

Input #文件号,变量列表

Line Input #文件号,变量

区别:1、前者可是变量列表,后者只能是一个变量。

2、前者遇“”双引号,将忽略只读取其内字串,若为变量列表,每个类型必须一致(逗号分隔)。如,若列表变量有整形,文件中却是字符,将返回0.

后面全读取,遇回车chr(13)若回车换行(vbCrLf)将结束。(符合其意,行输入)

3、前者对无关的空格直接忽略,后面只忽略回车或换行。





还有一个读取函数:

input(字符个数,#文件号) 根据字符个数读回,全部读回(包括“”,回车chr(13),换行chr(10))

注意:1、读取文件隐含一个文件位置的游标,指示下一次读取从当前游标读取,读完后移至本次读取取的最后。

2、是算的字符个数,不管它是双字节字符还是单字节字符。

3、若按字节个数读取,应inputB()函数

下图中结果中间有空行,是因为回车是chr(13)和chr(10)组成,第一个实现换行,第二再实现换行,就有了一个空行。



Input #FileNum,name,street,city,state,zip

可以使用 Input 函数来从文件向变量拷贝任意数量的字符,所给的变量大小应足够大。例如,以下的代码使用 Input 把指定数目的字符复制到变量。

LinesFromFile = Input(n,FileNum)

要将整个文件复制到变量,请使用 InputB 函数将字节从文件复制到变量。因为InputB 函数返回一个 ANSI 字符串,您必须使用 StrConv 函数将 ANSI 字符串转换为一个如下的 UNICODE 字符串:

LinesFromFile = StrConv(InputB(LOF(FileNum),FileNum),vbUnicode)



顺序文件的写到硬盘

它先写入到缓存中,在执行下一个写动作时或者关闭文件前,才由缓存区真正写入到硬盘上的文件中。

print #文件号,outlist


输出列表outlist可省,此时输出一空行。

outlist为: [space(N) | tab(N) ] [list] [符号]

space为空格,N为个数。space(3)即三个空格

tab(N)为绝对位置(从行首算起),若N小于当前行的行尾了,则后面的忽略(即失效),若大于,则之间用空格填充。

list 输出列表(可为多个)

符号 即两个:逗号时,下一个输出位置在当前位置向后第12个字符处

分号时,下一个输出位置在在前位置的下一个字符处。也可用空格分隔表达式,效果与分号同。

由此,只有列表最后一个输出表达式没有符号时,才自动换行。

print #一般与line input #配合 ,行行出状元啊




wirte #文件号,outlist


上面代码不变,仅由print改为write

可以看print与write的区别

1、write用紧凑写,无论是分号、逗号、空格等都视为紧凑。

2、同行列表间,系统自动填充逗号分隔

3、绝对写位置小于当前行时,自动换行到下行输出,其与前的分隔号(逗号)在上行末。

4、最后一句,系统以为有下一表达式写入,结果关闭文件了,所以其逗号仍在行末。

5、最重要的是,数值型表达式被视为了整数输出,其它字符则加上引号输出。


因此,此句write与input是绝佳配合的一对。 所以write与我们一般的输出不一样,时常带有双引号。

同样print与line input是另外的一对

所以:write写出是为了以后的input读入

print写出是为了打印和显示用。




Close #文件号

关闭前面打开的文件,若省略文件号,则关闭所有Open打开的文件。

隐含执行两步:1、把缓冲区中字符写出到文件中;2、释放文件号(句柄),方便其它使用和调用。

若程序没有此句进行关闭文件,系统也会自动关闭,但这样缓冲区有时不会写到文件而产生错误。





============================================================================================




随机文件

因是记录型,所以可以随机在任意位置访问。

Open FileName For Random [Access] [Lock] As #文件号 Len=每个记录长度

1、读取、写入都用此句

2、记录长度小于实际记录长度,会产生错误;大于实际长度,会浪费硬盘空间。

3、若不指明打开文件方式,就按Random方式进行打开(因为它读进,写出都是这个)

Close 关闭同前面顺序文件一样。


随机文件的读进与写出与顺序文件完全不同

Get(读进)

Put(写出)


Get #文件号,记录号或字节数,变量

Put #文件号,记录号或字节数,变量

省略记录则读取或写下紧接着的下一条记录。


这个语句简单,但包含的内容却复杂:

1、对于确定类型且确定长度的时,len与实际记录长度一致,进行写入。

2、对于不确定的类型或长度不确定时:

若为string(长度没法确定,又称可变长字串),先写入2个字节含长度说明的描述符,再写实际数据,故此时在记录长度上再加2来确定len

为Variant时:

数值型的Variant,先写入2个字节的类型描述符(可能是integer,或者Long等),再写实际数据,故此时在记录长度上再加2来确定len

String的Variant,先写入2个字节的类型描述符,再写2个字节的字串长度,再写实际的数据,故多出4个字节。故len+4

为动态数组时:

要先写入2+8*维数 个字节的描述符,再写实际数据。例 dim a(3,4) as integer 应写:(2+8*2)+2*3*4 (为Len长度)

为用户类型时:

同动态数组,先写入2+8*维数 个字节的描述符,再写实际数据。




所以可以看出,写入时看似简单,内部有复杂的判断的确认什么类型,多长,被写入到了文件中;读取会按这个逆过程进行识别读取。

因此,有时打开写入的文件,可能看似是乱字符,实际上是因为多了这些描述符的原因。




===========================================================================================================



二进制文件

按字节为单元进行存储的文件。所以读取和写入都是以字节为单位的。

此类基本上与随机文件一样,可以任意调整写入的位置。区别是随机文件以记录为单位,二进制以字节为单位。

读写的语句也一样。

注意:Seek(文件号)表示取得当前文件中的位置(游标)。

当打开文件时,游标就处于文件开始处(1),当写入文件时游标自动向后移动一个单位(记录、字节)

在写入时,是覆盖式,不是插入式。

由于是字节写入,如果文件中的字符是双字节的(如汉字),若恰好在中间,写入后打开文件,显示上,是乱的。




==========================================================================================================




Drive Dir File 控件的勾肩搭背

三个控件均与listBox有一定的关联



DriveListBox 驱动器列表控件

罗列硬盘各盘符(可以是网络上的硬盘)

属性:Drive(设置或返回盘符,注意返回时带有别名)

List,ListCount,ListIndex 盘符列表、个数、当前被选择的索引

TopIndex 设置或返回当前视图第一项的列表的索引。(如把索引为3的设置为当前视图中的第一项:list1.topindex=3)


DirListBox 文件夹列表控件

罗列文件夹。

属性: List,ListCount,ListIndex 文件夹列表、个数、当前选择项的索引

Path 文件夹所在的路径(即上级目录)

TopIndex同前

注意这个索引与其它索引的区别:

双击当前目录后,会展开下面的目录,此时的索引是当前目录为-1,它的上级目录为-2,以此类推

然后,单击(注意是单击选择)子目录,此时的索引范围是0到ListCount-1


FileListBox 文件列表控件

罗列文件

属性:Archive,Hidden,Hidden,Normal,System,ReadOnly 设置这此属性的文件是否显示。

Path,FileName 重点! 路径与文件名,注意这个FileName是与其它不同不包含路径的。Path也不同(根目录含,其它不含,所以要判断)

List,Listcount,ListIndex同前

Pattern 过滤,如“*.dll ; *.exe” 只显示dll和exe的文件,多个过滤用分号间隔

MultiSelect 0不多选,1简单多选,2复杂多选。

Selected(Index) 判断是否被选中。例多选时,遍历全列表,判断是否为真,为真就被选择中。

返回全路径时必须要判断:

    If Right$(File1.Path,1) = "" Then
        mystr = File1.Path & File1.FileName
    Else
        mystr = File1.Path & "" & File1.FileName '非根目录最后不含,所以要加上
    End If

事件:

PathChange 当File的Path发生更改时

PatterChange 当File的过滤发生更改时

DblClick Click 双击或单击File时发生(注意,没有点中其中一项时不会激发)


例1:

D盘A文件下有A1,A2文件夹,其中A1下面有三个文件,那么,选中A1时:

drive以驱动器为元素进行列表,故显示的是它的驱动器,其中drive属性是 D:

dir以文件夹为元素进行列表,故显示的是它的Path,其中Path属性是 D:A (尽管选择是A1,但path是D:A)

file是以文件为元素进行列表,故显示的是它的文件, 其中Path属性是 D:AA1 (注意与dir的Path的区别)


例2:

可以根据三个控件,来选择其中一个文件,用Shell(全路径文件名,【样式】)来调用其中一个文件。

也可根据需要读取其中内容。 LOF(文件号) len of file 文件长度。


==============================================================================


文件操作语句和函数


ChDrive strDrive

更改缺省盘符。strDrive为空串,则不会更改;若为多字符,只取第一个。chdrive "dceg" (取D:)。若盘符不存在将出错。

ChDir strPath

更改缺省目录 。若字串含盘符,同时更改驱动器。chdir "D:3" 。若目录不存在,将出错。

Kill filename

删除文件。文件可含路径,文件夹,驱动器等。还可用通配符*及?,这样就可一次删除多个文件。删除不存在或打开的文件将出错。

MkDir strPath

新建一个文件夹。同名文件已存在,新建将出错。最后加不加效果一样。即:mkdir "D:1" 与 mkdir "D:1" 语句一样。

删除文件夹

Dim fso As New FileSystemObject '首先声明一个FSO对象:
fso.DeleteFolder ("XXX") '删除英文双引号中指定的文件夹

FileCopy source,destination

复制文件。原文件必须存在。该文件具有复制和重命名功能,但不具的新建文件夹的功能。

例:filecopy "E:11.txt","E:22.txt"

E:11.txt必须存在,E:2文件夹必须存在(否则出错),2.txt可以重命名(包括后缀)。

Name old as new

重命名文件、文件夹。1、具有重命名文件夹功能,只能在同等目录下重命名,若新文件名该目录已存在,将出错

2、具有重命名文件 功能,源和目的的文件夹必须存在(否则出错),该功能具移动功能(源文件消失)

SetAttr filename,attribute

为文件设置属性。文件可含路径。属性为:vbNormal,vbReadOnly,vbHidden,vbSystem,vbArchive (可以相加取得组合值)


注意:chdrive,chdir是改变缺省路径,与app.Path不同(指的是程序目的)。

当指定了缺省路径后,程序引用文件名时可以不用路径(它自动使用缺省目录)。

例: Open "1.txt" for input as #1 ''自动使用缺省目录的1.txt文件。

===============================================================================================================



文件操作函数

CurDir strpath 取得当前路径。strpath省略,则取得当前目录,省略盘符则取得当前盘符。若strpath指定的不存在,返回当前盘符的路径。

注意:缺省目录在每个盘符都有一个值。因此,在改变当前缺省路径时须同时用chdrive和chdir来改变。

GetAttr pathname. 取得当前文件属性。和SetAttr是一对

FileDateTime 返回一个文件新建或最后修改的Variat(Date)型值。

FileLen pathname 返回文件的长度(Long)

LOF(文件号) 返回文件的长度(Long),注意这个打开后,里面内容的长度,与上面不同

EOF 判断打开后文件的游标是否在最后。


=================================================================================================================


FSO对象模型


FSO非VB内置对象,故要引用。该模型包含在Scripting类型库(Scrrun.dll)中。

它通过FileSystemObject对象,对文件(File/Files),文件夹(Folder/Folders),盘符(Drive/Drives),文本流(TextStream)等对象的操作


一。创建FileSystemObject对象,有两种

1、New创建

dim fsoA as new FileSystemObject

2、CreateObject创建

dim fsoA as Object '声明对象

Set fsoA =createObject(“Scripting.FileSystemObject”) ‘创建对象

注: CreateObject(ClassName,[serverName]) 根据类名(字串)创建一个对象。

二。FilesystemObject的属性与方法

1、属性:只有一个Drives(Drive对象的集合)



2、方法

这些方法主要是复制、移动、删除、创建(文件,文件夹),还有获取文件、文件夹、驱动器的信息,还有一个重要的打开文件(文件流)

Buildpath 追加名字到路径,有必要时自动添加分隔符 Function BuildPath(Path As String,Name As String) As String

Dim fso As New FileSystemObject,s As String
s = "E:1"
s = fso.BuildPath(s,"1.txt")
Text1.Text = s 'E:11.txt

CopyFile 复制一个或多个文件到另一地方,注意与FileCopy函数的区别。Sub CopyFile(Source As String,Destination As String,[OverWriteFiles As Boolean = True])

可用通配符,OverWrite来确定是否覆盖。eg: fso.CopyFile "E:4*.*","E:2",True

CopyFolder 递归地复制一个文件到另一地(含子文件夹内文件) object.CopyFoldersource,destination[,overwrite]
源最后可用通配符:fso.CopyFolder "E:4*",True

CreateFolder 创建一个文件夹(若已经存在,将出错)Function CreateFolder(Path As String) As Folder

fso.CreateFolder "E:3"

CreateTextFile 创建一个Txt文件(返回TextStream对象)CreateTextFile(filename[,overwrite[,unicode]])

    Dim ts As TextStream
    Set ts = fso.CreateTextFile("E:33.txt",True,True)
    ts.WriteLine ("中国") '覆盖式写入
    ts.Close

上面是复制、创建,下面开始删除

DeleteFile 删除文件(可含通配符),对只读文件时须确认为真。Sub DeleteFile(FileSpec As String,[Force As Boolean = False])

fso.DeleteFile "E:3*.*",True ‘与Kill类似

DeleteFolder 删除文件夹(可用通配符,包括子文件夹和内容一齐删除)Sub DeleteFile(FileSpec As String,[Force As Boolean = False])

fso.DeleteFolder "e:3*",True

DriveExists,FileExits,FolderExists 判断驱动器,文件,文件夹是否存在。

Function DriveExists(DriveSpec As String) As Boolean ‘字串不能带文件夹,否则返回假。假定有E盘,"E","E:","E:"都为真,但"E:1"是假

Function FileExists(FileSpec As String) As Boolean

Function FolderExists(FolderSpec As String) As Boolean

可删除介质的驱动器(如光盘),无光盘时DriveExists返回也为真,须用Drive对象的IsReady来判断是否有光盘。

Dim fso As New FileSystemObject ‘假定有光驱G
Print fso.DriveExists("G") ’True
Print fso.GetDrive("G").IsReady ‘无光盘时False。 Function GetDrive(DriveSpec As String) As Drive (返回Drive对象)

GetDrive 返回指定路径的驱动器对象。

GetDriveName 返回指定字串中的盘符(哪怕盘符实际不存在,也返回),字 串中无法取得盘符时返回空串。

Function GetDriveName(Path As String) As String

fso.GetDriveName("a:bcd") ‘哪怕没有A盘也返回A: 同时path字串不是路径也只是机械的返回前两个字符。

GetExtensionName 获取文件的后缀名。Function GetExtensionName(Path As String) As String

Print fso.GetExtensionName("E:41.txt") ‘txt

GetBaseName 获取文件名(不含后缀名)。Function GetBaseName(Path As String) As String

Print fso.GetExtensionName("E:4123.txt") ‘123

GetAbsolutePathName 获取完整路径

GetFile 返回指定路径的文件对象。Function GetFile(FilePath As String) As File

GetFileName 取得指定路径的最后部件(文件名或文件夹名,不含路径)。Function GetFileName(Path As String) As String

有E:41.txt. fso.GetFileName("E:41.txt") ' 1.txt

fso.GetFileName("E:4") ' 4

GetFolder 返回指定路径的文件夹对象。 Function GetFolder(FolderPath As String) As Folder

GetParentFolderName 获取上级目录名 Function GetParentFolderName(Path As String) As String

GetSpecialFolder 返回特殊的文件夹对象。Function GetSpecialFolder(SpecialFolder As SpecialFolderConst) As Folder

特殊文件夹指:0-WindowsFolder (windows目录)

1-SystemFolder (系统文件夹)

2-TemporaryFolder (临时文件夹)

GetTempName 返回随机产生的文件或文件夹的名字。Function GetTempName() As String

它并不实际产生一个文件,只产生一个不重复的字串,再用CreatTextFile来创建文件或由CreateFolder来创建文件夹。

MoveFile 移动文件到另一个地方(可用通配符)Sub MoveFile(Source As String,Destination As String)

MoveFolder 移动文件夹到另一个地方(可用通配符)Sub MoveFolder(Source As String,Destination As String)

OpenTextFile 打开文件(返回TextStream对象)OpenTextFile(filename[, iomode[, create[, format]]])

iomode: 1-ForReading,8-ForAppending forwriting

Create: True新建,False不新建

Format: 0-TristateFalse(缺省,ASC码打开),-1-TristateTrue(Unicode打开),-2-TristateUseDefault(系统缺省)



三。被操作的对象:File,files,Folder,Folders,Drive,Drives 它们的属性基本相同。

比如:Folder对象:Attributes,DateCreated,DateLastAccessed,DateLastModified,Drive,Files,IsRootFolder

Name,ParentFolder,Path,Shortname,ShortPath,Size,SubFolders,Type

方法:Copy,CreateTeatFile,Delete,Move

File对象:Attributes,DateCreated,DateLastAccessed,DateLastModified,Drive,Name,ParentsFolder,Path

ShortName,ShortPath,Size,Type

方法:Copy,Delete,Move,OpenAsTextStream

Drive对象:AvailableSpace,DriveLetter,DriveType,FileSystem,FreeSpace,IsReady,Path,RootFolder,SerialName

TotalSize,VolumeName

Files,Drives为集合,有Count,Item属性。


四、TextStream对象

属性:AtEndOfLine(行末),AtEndOfStream(文件末),Column(当前列位置),Line(当前行位置)

方法:Close 关闭

Read(Number) 从当前向后读N个字符

ReadAll 读取整个文件大小(对大文件费资源,用一行一行读较好)

ReadLine 读取一行(遇换行结束,但不含换行符)

Skip(number) 跳过N个字符,相当于把游标下移N个

SkipLine 下跳一行

Write 写文件(由OPen时决定是覆盖或追加)

WriteLine 写入一行。

WriteBlankLines(Number) 写入N个空行。

Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("E:41.txt",ForWriting)
ts.Write "abc"



==========================================================================================================



INI文件

又称初始化文件,用来保存相关设置值,在启动软件时行读取。样式如下:

【节】 'Section

键=值 ‘Key=Value


它主要通过API快速进行读取。通过下面三个API:

Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String,

ByVal lpKeyName As String,

ByVal nDefault As Long,

ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String,

ByVal lpReturnedString As String,

ByVal nSize As Long,

ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,

ByVal lpKeyName As Any,

ByVal lpDefault As String,

ByVal lpReturnedString As String,

ByVal nSize As Long,

ByVal lpFileName As String) As Long

GetPrivateProfileString 为指定条目取得字串,返回值Long。字串在lpReturnedString中.

lpApplicationName String,欲在其中查找条目的小节名称。这个字串不区分大小写。

如设为vbNullString,就在lpReturnedString缓冲区内装载这个ini文件所有小节的列表
lpKeyName String,欲获取的项名或条目名。这个字串不区分大小写。

如设为vbNullString,就在lpReturnedString缓冲区内装载指定小节所有项的列表
lpDefault String,指定的条目没有找到时返回的默认值。可设为空("")
lpReturnedString String,指定一个字串缓冲区,长度至少为nSize
nSize Long,指定装载到lpReturnedString缓冲区的最大字符数量
lpFileName String,初始化文件的名字。如没有指定一个完整路径名,windows就在Windows目录中查找文件
注: 如lpKeyName参数为vbNullString,那么lpReturnedString缓冲区会载入指定小节所有设置项的一个列表。

每个项都用一个NULL字符分隔,最后一个项用两个NULL字符中止。也请参考GetPrivateProfileInt函数的注解
lenReturn = GetPrivateProfileString("config","title",vbNullString,strReturn,&HFF,App.Path & "config.ini")

取得的字串在strReturn中


写入相关值的AIP如下:

Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String,

ByVal lpString As String,

ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String,

ByVal lpKeyName As Any,

ByVal lpString As Any,

ByVal lpFileName As String) As Long

WritePrivateProfileString 设置小节内的字串

lpApplicationName String,要在其中写入新字串的小节名称。这个字串不区分大小写
lpKeyName Any,要设置的项名或条目名。这个字串不区分大小写。用vbNullString可删除这个小节的所有设置项
lpString String,指定为这个项写入的字串值。用vbNullString表示删除这个项现有的字串
lpFileName String,初始化文件的名字。如果没有指定完整路径名,则windows会在windows目录查找文件。

如果文件没有找到,则函数会创建它

lenReturn = WritePrivateProfileString("config",Me.Caption,App.Path & "config.ini")

Config.ini文件如下:

[config] title=Form1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读