哪位同志贴一下所有文本文件操作的函数操作?高分了……

tinafang 2004-09-10 05:10:43
如题
要用的时候老是要来搜索,太麻烦,想收藏一下
...全文
347 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcm123 2004-09-18
  • 打赏
  • 举报
回复
msdn上就有

dongle2001 2004-09-12
  • 打赏
  • 举报
回复
7、DeleteFile

  作用:删除指定文件

  声明形式:

Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

  说明:Long,非零表示成功,零表示失败。会设置GetLastError

  与vb的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除.

  参数说明:

参数 类型及说明
lpFileName String,欲删除文件的名字

  示例代码如下:

‘函数声明

Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

Private Sub Form_Load()

 DeleteFile "c:\test.txt"

End Sub

  以上代码删除了c:\test.txt文件

  写了这没多,真的很累了,所以更希望自己的辛苦没有白费,VB虽然是一个RAD类的工具,并让很多人不屑使用,但实事求是得说,VB的功能的确强大,尤其是人性化的设计,让人爱不释手,希望对喜爱VB的爱好者能够对vb能产生一个新的认识,而不仅仅停留在对其提供的现有控件的使用。

dongle2001 2004-09-12
  • 打赏
  • 举报
回复
2、lcreat

  作用:创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写

  声明形式:

Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName As String, ByVal iAttribute As Long) As Long

  说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。如果出错,则返回HFILE_ERROR

  该函数会打开已由其他应用程序打开的文件,所以使用它时要小心。win32的CreateFile函数已取代了这个函数。这个函数与vb的open语句作用相同

  参数说明:

参数 类型及说明
lpPathName String,欲创建的文件的名字
iAttribute Long,下述值之一:
 0——文件能够读写
 1——创建只读文件
 2——创建隐藏文件
 3——创建系统文件

  例如下面的语句打开c:\test.txt文件

lcreat “c:\test.txt”,0
3、lopen

  作用:以二进制模式打开指定的文件

  声明形式:

Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

  说明:此函数的返回值类型为Long,如执行成功,返回打开文件的句柄。HFILE_ERROR表示出错。会设置GetLastError

  CreateFile函数在win32下提供了更多的功能:

  参数说明:

参数 类型及说明
lpPathName String,欲打开文件的名字
iReadWrite Long,访问模式和共享模式常数的一个组合,如下所示:
1、访问模式
READ 打开文件,读取其中的内容
READ_WRITE 打开文件,对其进行读写
WRITE 打开文件,在其中写入内容
2、共享模式(参考OpenFile函数的标志常数表)
OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ, OF_SHARE_DENY_WRITE, OF_SHARE_EXCLUSIVE

  4、GetFileTime

  作用:取得指定文件的时间信息

  声明形式:

Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long

  说明:Long,非零表示成功,零表示失败。会设置GetLastError

  如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以设置为零(用ByVal As Long)。这个函数返回的文件时间采用UTC格式

  参数说明:

参数 类型及说明
hFile Long,文件的句柄
lpCreationTime FILETIME,用于装载文件的创建时间
lpLastAccessTime FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)
lpLastWriteTime FILETIME,用于装载文件上一次修改的时间

  示例代码如下:

‘函数声明

Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FileTime, lpLastAccessTime As FileTime, lpLastWriteTime As FileTime) As Long

Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

‘定义变量

Dim file As Long
Dim CreationTime As FileTime
Dim lastaccesstime As FileTime
Dim lastaccesstime As FileTime

‘定义结构

Private Type FileTime
 dwLowDateTime As Long
 dwHighDateTime As Long

End Type

Private Sub Form_Load()
 str1 = "c:\text.txt"
 file = lopen(str1, READ_WRITE) ‘打开文件
 temp = GetFileTime(file, CreationTime, lastaccesstime, lastwritetime)’得到文件相关信息
 MsgBox CreationTime ‘显示信息

End Sub

  以上代码显示文件的创建时间

  5、CopyFile

  作用:复制文件。与vb的filecopy命令相似

  声明形式:

Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

  说明:Long,非零表示成功,零表示失败。会设置GetLastError

  参数说明:

参数 类型及说明
lpExistingFileName String,源文件名
lpNewFileName String,目标文件名
bFailIfExists Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。否则目标文件被改写

  示例代码如下:

‘函数声明

Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

Private Sub Form_Load()

 CopyFile "c:\test1.txt", "c:\test2.txt", 1

End Sub

  以上代码将c:\test1.txt 拷贝到c:\test2.txt

6、MoveFile, MoveFileEx

  作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx

  声明形式:

Declare Function MoveFile& Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String)

Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long)

  说明:Long,非零表示成功,零表示失败。会设置GetLastError

  这两个函数通常不能将文件从一个卷移动到另一个卷。但如设置了MOVEFILE_COPY_ALLOWED标记,MoveFileEx可以做到这一点.

  参数说明:

参数 类型及说明
lpExistingFileName String,欲移动的文件名
lpNewFileName String,新文件名
dwFlags Long,一个或多个下述常数
MOVEFILE_REPLACE_EXISTING 如目标文件存在,则将其替换
MOVEFILE_COPY_ALLOWED 如移动到一个不同的卷,则复制文件并删除原来的文件
MOVEFILE_DELAY_UNTIL_REBOOT 移动操作在系统下次重新启动时正式进行。这样便可在Windows NT中改换系统文件

  示例代码如下:

‘定义结构

Private Const MOVEFILE_COPY_ALLOWED = &H2
Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4
Private Const MOVEFILE_REPLACE_EXISTING = &H1

‘函数声明

Private Declare Function MoveFile& Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String)

Private Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long)

Private Sub Form_Load()
 MoveFile "c:\test.txt", "d:\test1.txt" ‘移动文件
 MoveFileEx "d:\test1.txt", "c:\test.txt", MOVEFILE_REPLACE_EXISTING ‘再一次移动
End Sub

  以上代码实现了文件的移动,两次移动後,文件不变
dongle2001 2004-09-12
  • 打赏
  • 举报
回复
下面是windows中提供的对于文件进行操作的API函数及其功能:

Windows API函数 功能
CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。涉及文件处理时,这个函数通常与vb的close命令相似。应尽可能的使用close,因为它支持vb的差错控制。注意这个函数使用的文件句柄与vb的文件编号是完全不同的
CompareFileTime 根据FILETIME结构的信息,对比两个文件的时间
CopyFile 复制文件。与vb的filecopy命令相似
CreateFile 这是一个全功能的函数,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台
DeleteFile 删除指定文件
FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
FindFirstFile 根据文件名查找文件
FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区
GetBinaryType 判断文件是否可以执行
GetFileAttributes 判断指定文件的属性
GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制——在一个BY_HANDLE_FILE_INFORMATION结构中装载与文件有关的信息
GetFileSize 判断文件长度
GetFileTime 取得指定文件的时间信息
GetFileType 在给出文件句柄的前提下,判断文件类型
GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息
GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区
GetShortPathName 获取指定文件的短路径名
GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用
lclose 关闭指定的文件,请参考CloseHandle函数,了解进一步的情况
lcreat 创建一个文件。如文件已经存在,就会将其缩短成零长度,并将其打开,以便读写
llseek 设置文件中进行读写的当前位置。该函数与vb的seek语句类似。如果用vb的open命令打开了一个文件,那么不要再对这个文件使用llseek函数
LockFile 在windows中,文件可用共享模式打开——在这种情况下,多个进程可同时访问该文件。利用这个函数,要对文件进行读写的一个应用程序可将文件的某一部分锁定起来,使其不能由其他应用程序访问。这样便避免了同时读写时发生的冲突
LockFileEx 与LockFile相似,只是它提供了更多的功能
lopen 以二进制模式打开指定的文件
lread 将文件中的数据读入内存缓冲区
lwrite 将数据从内存缓冲区写入一个文件
MoveFile, MoveFileEx 移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx
OpenFile 这个函数能执行大量不同的文件操作。和这个函数相比,请优先考虑win32的CreateFile函数(它能打开命名管道和控制Unicode文件名,同时不受128个字符的路径名称的限制)
ReadFile 从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
SearchPath 查找指定文件
SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾
SetFileAttributes 设置文件属性
SetFilePointer 在一个文件中设置当前的读写位置
SetFileTime 设置文件的创建、访问及上次修改时间
UnlockFile 解除对一个文件的锁定
UnlockFileEx 解除对一个文件的锁定
WriteFile 将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理
WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调

  让我们通过几个例子来详细的了解一下其中主要的几个函数及其用法:
、CreateFile

  作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台

  声明形式:

Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

  说明:

  此函数的返回值类型为Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS

  打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING。

  这个函数代替了lOpen 和 lCreate函数,应该是我们的首选

  参数说明:

参数 类型及说明
lpFileName String,要打开的文件的名字
dwDesiredAccess Long,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes SECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition Long,下述常数之一:
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 讲现有文件缩短为零长度
dwFlagsAndAttributes Long,一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile Long,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

  示例如下:

long hfile= CreateFile(“c:\\test.txt”,GENERIC_READ,

FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,

OPEN_EXISTING,FILE_ELAG_OVERLAPPED,NULL)
intocsdn 2004-09-11
  • 打赏
  • 举报
回复
我来顶一下
helanshan 2004-09-10
  • 打赏
  • 举报
回复
up
flyingZFX 2004-09-10
  • 打赏
  • 举报
回复
我一共回复了三次,

你分别分三次把分给了就行了。
tinafang 2004-09-10
  • 打赏
  • 举报
回复
倒啊,给分的程序是不是有什么问题啊
总是提示
“100,0,0,0 贴子回复次数大于跟给分次数 ”
starsoulxp 2004-09-10
  • 打赏
  • 举报
回复
Public Function Replice(ByVal S As String) As String
Dim tempS as String
If Len(tailChr) > 0 Then ' 检索成对标记
Do While Len(S) > 0
If Not flag Then ' 不处在检索“终点”状态
If InStr(S, headChr) > 0 Then
Replice = Replice & StrHead(S, headChr)
flag = True
Else ' 处在检索“终点”状态
Replice = Replice & S
Exit Do
End If
End If

If InStr(S, tailChr) > 0 Then ' 检索“终点”
tempS=StrHead(S, tailChr)
If mapObj Is Nothing Then
Replice = Replice & reStr
Else
' 如果存在映射类的话,调用映射类的Map函数
Replice = Replice & mapObj.Map(tempS)
End If
flag = False
Else
Exit Do
End If
Loop
Else ' 检索单字符串
Do While Len(S) > 0
If InStr(S, headChr) > 0 Then
Replice = Replice & StrHead(S, headChr)
Replice = Replice & reStr
Else
Replice = Replice & S
Exit Do
End If
Loop
End If
End Function
---- 三、完成文件替换

----   有了上面的基础后,就可以通过一个全局模块将具体到文件的的功能实现了:

----   1、替换单元集合

----   定义一个集合来保存各各替换单元,我们设想将替换条件保存于一个文件中,称之为“条件定义文件”,文件中每一行定义一个替换条件,定义格式如上文对替换单元类中对Init参数的描述。这样可以很方便在实现单元集合的初始化:

Public reUnits As Collection
' 全局的替换单元集合

Public Function InitUnits
(ByVal fn As String) As Boolean
Dim F As New TextFile, S As String
Dim unit As reUnit

If F.OpenRead(fn) Then
Set reUnits = New Collection
Do While F.GetLine(S)
If Len(S) > 0 Then
Set unit = New reUnit
unit.Init S
reUnits.Add unit
End If
Loop
InitUnits = True
Else
InitUnits = False
End If
End Function
----   2、单个文件替换

----   当确定了所要替换的文件及替换后的文件,就可以分别调用替换单元集合中的单元替换函数来进行替换了:

Public Function ReplaceFile(ByVal sFn As String,
ByVal dFn As String) As Boolean
Dim sFile As New TextFile, dFile As New TextFile
If Not sFile.OpenRead(sFn) Then GoTo reErr
If Not dFile.OpenWrit(dFn) Then GoTo reErr

Dim unit As reUnit
Dim buff As String

Do While sFile.GetLine(buff)
For Each unit In reUnits
'调用集合中的每一个单元进行替换
buff = unit.Replice(buff)
Next
If Len(buff) > 0 Then dFile.PutLine buff
Loop
ReplaceFile = True
Exit Function
reErr:
ReplaceFile = False
End Function
----   3、替换过程

----   利用前两个函数,实现文件替换的全过程,该过程需要“源文件”、“目标文件”及“条件定义文件”三个参数,也是整个程序所需的参数: Public Sub RepFile(ByVal sFn As String, ByVal dFn As String, ByVal defFn As String) Dim info As String If InitUnits(defFn) Then If ReplaceFile(sFn, dFn) Then info = "替换成功!" Else info = "文件不能打开!" End If Else info = "定义文件不能打开!" End If MsgBox info End Sub

---- 四、界面及完成整个程序

----   1、界面窗口

----   窗体(frmRep)可以让使用者输入上面要求的三个参数,然后调用RepFile实现替换。在这个窗体中,主要由三个文本编辑框(txtFn(0-2))和两个按钮(cmOk、cmClose)组成,两个事件响应函数如下:

Private Sub cmOk_Click()
RepFile txtFn(0), txtFn(1), txtFn(2)
End Sub

Private Sub cmClose_Click()
Unload Me
End Sub
----   2、入口函数

----   可以把frmRep窗体定义为启动窗体,但这样使程序在应用过程中缺少灵活性,所以不妨定义一个入口函数,对命令行参数进行分析,当条件满足时,就可以不必激活frmRep窗体了:

Public Sub Main()
Dim cm As String
Dim sFn As String, dFn As String, defFn As String

cm = Command
If Len(cm) > 0 Then sFn = StrHead(cm, " ")
If Len(cm) > 0 Then dFn = StrHead(cm, " ")
If Len(cm) > 0 Then defFn = StrHead(cm, " ")

If Len(sFn) > 0 And Len(dFn) > 0 And Len(defFn) > 0 Then
RepFile sFn, dFn, defFn '条件满足,进行替换
Else
Dim frm As New frmRep '条件不足,建立窗体
frm.txtFn(0) = sFn '把已有条件预先填上
frm.txtFn(1) = dFn
frm.txtFn(2) = defFn

frm.Show
End If
End Sub
starsoulxp 2004-09-10
  • 打赏
  • 举报
回复
用VB进行文本文件的再处理
程序员之家 作者:旅者整理 日期:2002-9-26 23:54:00

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

大众日报社信息中心
郭玉荣、王飞
---- 越来越多的人开始认识到Internet这一信息资源的巨大宝库,但是把信息从网上下载下来后,繁杂多样的文件格式却给整理、使用带来相当大的麻烦。有的由于系统平台的变化,甚至显示出来是一团乱糟糟东西。那么要想更好、更方便地利用网络资源,一个得力的文本文件处理工具就显得非常必要。如果四处去寻找一个这样的工具,不仅不容易,找到后可能并不符合我们的要求,但是如果你有VB,那么为什么不自己开发一个这样的工具程序呢?相信我,这并不困难,只要你已经对VB有所了解,一个方便实用的小工具已经在等着你了!

----   先来分析一下这个程序要完成的主要任务吧,象这样的文本处理,可以归纳为两种形式,就是替换和清除,如果把清除看成是替换成空的话,那么唯一个任务就是替换了。就替换面言,可能会有以下几种形式:

将一段文字替换成另一段

将某两个特殊标识符之间的文字替换成另外一些文字

将某两个特殊标识符之间的文字按照某种规律进行转换
----   搞清这几个任务,我们就可以着手编程了。一个好的程序员,不应每次都是从零做起,平常一些基础模块的积累,可以增加我们制做大程序的信心。下面我先对程序中用到的我的基础库中的内容进行一下介绍,然后再解决每一个具体问题。

---- 一、准备过程

----   1、字符串处理函数(StrHead)

----   用VB来实现这个程序,首先要解决的是如何方便地进行字符串处理,VB中原有的函数InStr和Mid,使用起来并不方便,我利用这两个函数编写出一个新的函数:StrHead,该函数根据指定的断点字符将字符串截断,断点前的字符串被返回,后面部分保留在原字符串中,该函数可以完成大部分字符串操作。函数代码如下:

Public Function StrHead(ss As String,
ByVal c As String) As String
Dim i As Long

i = InStr(ss, c)
If i > 0 Then
StrHead = Mid(ss, 1, i - 1)
ss = Mid(ss, i + Len(c))
Else
StrHead = ss
ss = ""
End If
End Function
----   2、文本文件类(TextFile)

----   程序中涉及到很多文件操作,为了方便,可以先将对文件操作的过程封装到一个类中,这样不仅可以提高编程效率,还可以大大减少出错的机会。因为本课题主要是面对文本文件的,这样我们只编写一个处理文本文件读写类(TextFile)就可以了,该类的几个主要功能函数列在下面:

' 文本文件类(TextFile.cls)
Option Explicit

Dim FileNum As Integer

' 打开文件用于写
Public Function OpenWrit(fn As String) As Boolean
On Error GoTo OWErr

FileNum = FreeFile
Open fn For Output Access Write As #FileNum
OpenWrit = True

Exit Function
OWErr:
OpenWrit = False
End Function

' 打开文件用于读
Public Function OpenRead(fn As String) As Boolean
On Error GoTo ORErr

FileNum = FreeFile
Open fn For Input Access Read As #FileNum
OpenRead = True

Exit Function
ORErr:
OpenRead = False
End Function

' 关闭文件
Public Sub CloseFile()
If FileNum > 0 Then
Close #FileNum
FileNum = 0
End If
End Sub

' 从文件中读取一行
Public Function GetLine(S As String) As Boolean
On Error GoTo NotGet

If EOF(FileNum) Then GoTo NotGet
Line Input #FileNum, S
GetLine = True

Exit Function
NotGet:
GetLine = False
End Function

' 往文件中写入一行
Public Function PutLine(Byval S As String) As Boolean
On Error GoTo NotPut

Print #FileNum, S
PutLine = True

Exit Function
NotPut:
PutLine = False
End Function

' 类在结束时,自动关闭文件
Private Sub Class_Terminate()
CloseFile
End Sub
---- 二、替换单元类

----   做为一个通用的工具,我们现在并不知道要将什么替换为什么,这些信息是要在使用者使用时告诉程序的,这就需要将各种替换任务进行参数化,用最简单明确的方式描述出来。这里我们实现的个替换单元类(reUnit),用它来接受参数并完成替换任务。

----   1、替换条件的描述及初始化

----   为了能在一次处理中,实现多种替换,定义一个“替换单元”类:reUnit,来承担主要的替换任务。这个类中定义了替换的条件:

Dim headChr As String '启始符
Dim tailChr As String '结束符
Dim reStr As String '替换为
Dim mapObj as Object '映射对象
----   通过上面三个变量来描述替换条件:headChr和tailChr代表检索的起点和终点,当tailChr为零长时,表示只对某字符串进行替换。reStr是替换后的字符串,为零长时即表示清除。该类用下面两个函数来设置上面的三个变量:

Public Sub Init(ByVal S As String)
headChr = EscStr(StrHead(S, ","))
tailChr = EscStr(StrHead(S, ","))
reStr = EscStr(S)
If Left(reStr,1)="@" Then
'第一个字符是"@",它所代表的是一个映射类
Set mapObj = CreateObject(Mid(reStr,2))
End If
End Sub

Private Function EscStr(ByVal S As String) As String
Dim h As Long
EscStr = ""
Do While Len(S) > 0
EscStr = EscStr & StrHead(S, "&")
If Len(S) > 0 Then
h = "&H" & StrHead(S, ";")
EscStr = EscStr & Chr(h)
End If
Loop
End Function
----   函数Init接受一个字符串S,其中应包含“起点”、“终点”和替换后的字符串,他们之间用逗号分隔。为了能将非键盘字符加入其中,可以用“&HHHH;”的形式将任意字符插入其间,HHHH表示一个十六进制数,通过EscStr函数来完成这种替代。

----   这里需要说明的是,类中定义了一个mapObj变量,它是为了实现“特殊标识符之间的文字按照某种规律进行转换”而设计的。因为这种规律性现在我们并不知道,我们只能在这里为今后留下的个接口,假设一个类实现了某种规律的映射,并通过下面这样的函数来提供这种映射:

Public Function Map(Byval ss as String) as String
----   我们规定,如果reStr的第一个字符是"@"的话,它所代表的就不是一直接替换为的字符串,而是的个映射类的标识名,我们将通过CreateObject函数来建立这个对象,在替换时调用它的Map函数。

----   2、替换函数

----   该类的Replice函数完成对字符串的替换任务,由于是对文件中的数据以一行为单位依次调用该函数的,所以要考虑到“起点”与“终点”不在同一行上的情况,所以首先定义一个标记变量:

Dim flag As Boolean
----   当flag为假时,表示不处在检索“终点”状态,为真时为检索“终点”状态。下面是Replice函数的代码:



tinafang 2004-09-10
  • 打赏
  • 举报
回复
多谢,加分了
flyingZFX 2004-09-10
  • 打赏
  • 举报
回复
(三)写文件

  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中目前的字节数.

  使用方法可参考二进制文件的读操作.


flyingZFX 2004-09-10
  • 打赏
  • 举报
回复
(二)读文件

  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
flyingZFX 2004-09-10
  • 打赏
  • 举报
回复
(一)打开和关闭文件

  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文件.



7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧