Excel-VBA操作文件四大方法之一
在我们日常使用Excel的时候,不仅会用到当前Excel文件的数据,还经常需要访问其他的数据文件。这些数据文件可能是Excel文件、文本文件或数据库文件等。经常有朋友会问如何在vba代码里操作这些数据文件?本文就系统地介绍一下在Excel中应用VBA操作数据文件的方法。 本文主要介绍四种常用的方法: 当然对于数据库文件,还可以利用ADO+SQL的方法操作,不过论坛已经有前辈详细介绍过此类方法,本文就不再重复了。 一、利用Excel对象来处理文件 利用Excel对象自带的方法来操作文件是最方便,也是最简单的。 1、打开Excel文件 我们可以用Workbooks.Open方法打开一个Excel工作簿。 2、打开文本文件 使用Open方法也可以打开文本文件,但建议使用OpenText方法。此方法是载入一个文本文件,并将其作为包含单个工作表的工作簿进行分列处理,然后在此工作表中放入经过分列处理的文本文件数据。完整语法如下: 关于以上参数的具体含义可以参看VBA的帮助,这里就不重复了。在实际的编程中,一般无需对这些复杂的参数进行处理。可以通过录制宏来得到打开一个文本文件的VBA代码。具体方法就是选择“文件——打开”,然后选择打开文本文件,就会出现文本导入向导,一步一步执行完,直到文本打开后,停止录制。 ‘ 在实际编程中只要做相应的修改就可以使用了。 3、打开其他文件 利用Excel对象还可以打开XML文件和一些数据库(如Access)文件,对应XML文件,需要Excel2003以上的版本。 OpenXML方法的语法如下: Stylesheets Variant 类型,可选。单个值或值的数组,用于指定要应用哪些 XSL 转换 (XSLT) 样式表处理指令。 LoadOption Variant 类型,转换。指定 Excel 打开 XML 数据文件的方式。可为 XlXmlLoadOption 常量之一。 XlXmlLoadOption 可为以下 XlXmlLoadOption 常量之一:
Sub UseOpenXML() OpenDatabase 方法语法如下: FileName String 类型,必需。连接字符串。 CommandText Variant 类型,可选。查询的命令文本。 CommandType Variant 类型,可选。查询的命令类型。以下是可用的命令类型:Default、SQL 和 Table。 BackgroundQuery Variant 类型,可选。查询的背景。 ImportDataAs Variant 类型,可选。确定查询的格式。 示例 Sub OpenDatabase() Workbooks.OpenDatabase FileName:="C:\northwind.mdb" End Sub 4、保存文件 文件的保存使用Workbook对象的Save或SaveAs方法。 如果是第一次保存工作簿或要另存为,请使用 SaveAs 方法为该文件指定文件名。 具体参数含义可参看VBA帮助,使用都比较简单。 Set NewBook = Workbooks.Add Application.GetSaveAsFilename为调出标准的“另存为”对话框,获取用户文件名,但并不真正保存任何文件,然后使用代码保存文件。还有Application.GetOpenFileName可以调出标准的“打开”对话框。 5、关闭文件 关闭文件可以使用Workbooks集合或Workbook对象的 Close 方法。前者是关闭所有打开的工作簿,后者关闭特定的工作簿。 SaveChanges参数表示是否保存更改,对许多不需要更改的操作,可设置为False以免弹出保存更改提示的对话框。 示例 Workbooks("BOOK1.XLS").Close SaveChanges:=False Workbooks.Close 6、综合实例 假如F盘有一个Excel文件test.xls,现在有另一个Excel文件要访问test.xls的数据,我们来看用VBA代码如何操作。代码如下: 7、总结 利用Excel对象的方法进行文件操作是最简单,也是最方便的,适合初学者。对于Excel文件格式,如果我们仅仅是读取其表格中的内容,这种方法也是首选。对于文本文件的操作,使用第二种方法比较方便,若要将文本转换成表格,那么使用此方法也是合适的。
如何在d:\test.xls已打开的情况下不让以下的语句再去创建一个test.xls的实例(虽然它标识为只读), 并给出文件已打开的提示. 先做一个判断!判断该工作簿是否打开了?
例如: Set xlexcel = CreateObject("excel.application") dim wb as object set wb = xlexcel.workbooks("test.xls") if wb is nothing then msgbox "工作簿未打开!" xlexcel.Workbooks.Open "d:\test.xls" end if Excel-VBA操作文件四大方法之二
二、利用VBA文件处理语句来处理文件 VBA包含了许多用于文件操作的语句和函数,可以满足绝大多数情况下的文件操作要求。下面我们按照操作目的进行一一介绍。 (一)文件处理 语法:Name oldpathname As newpathname 功能:重命名一个文件、目录、或文件夹,移动一个文件。 说明:在一个已打开的文件上使用 Name,将会产生错误。进行文件操作时,一定要注意错误处理。 示例: 注意:Name不能移动一个目录或文件夹。 2、FileCopy 语句 语法:FileCopy source, destination 功能:复制一个文件。 说明:如果对一个已打开的文件使用 FileCopy 语句,则会产生错误。 示例: 3、Kill 语句 语法:Kill pathname 功能:从磁盘中删除文件。 说明:Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。如果使用 Kill 来删除一个已打开的文件,则会产生错误。 示例: 4、GetAttr 函数 语法:GetAttr(pathname) 功能:获取一个文件、目录、或文件夹的属性。返回一个 Integer值。 返回值 由 GetAttr 返回的值,是下面这些属性值的总和: 常数 值 描述 说明:若要判断是否设置了某个属性,在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。 示例: 为判断一个文件是否只读,可用下法: 5、SetAttr 语句 语法:SetAttr pathname, attributes 功能:为一个文件设置属性。 说明:如果想要给一个已打开的文件设置属性,则会产生运行时错误。 示例: 6、FileLen 函数 语法:FileLen(pathname) 功能:获取一个文件的长度,单位是字节。 说明:当调用 FileLen 函数时,不需要打开文件,如果所指定的文件已经打开,则返回的值是这个文件在打开前的大小。 7、FileDateTime 函数 语法:FileDateTime(pathname) 功能:获取一个文件被创建或最后修改后的日期和时间。 示例:
1、CurDir 函数 语法:CurDir[(drive)] 功能:返回当前的路径。 说明:drive 参数是可选的,它指定一个存在的驱动器。如果没有指定驱动器,或 drive 是零长度字符串 (""),则 CurDir 会返回当前驱动器的路径。 示例: 2、ChDir 语句 语法:ChDir path 功能:改变当前的目录或文件夹。 说明:ChDir 语句改变缺省目录位置,但不会改变缺省驱动器位置。缺省驱动器一般是C。 示例: ChDir "D:\temp" 3、ChDrive 语句 语法:ChDrive drive 功能:改变当前的驱动器。 说明:如果使用零长度的字符串 (""),则当前的驱动器将不会改变。如果 drive 参数中有多个字符,则 ChDrive 只会使用首字母。 示例: 与上例比较,用CurDir返回的是“D:\temp”,当前驱动器已经变为D了。 4、Dir 函数 语法:Dir[(pathname[, attributes])] 说明:在第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。 Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。 示例: 以下过程可显示C盘根目录下的所有目录. MyPath = "c:\" End Sub 以下过程利用递归可以查找目录和子目录下的所有文件。 Public Sub FindFile(mPath As String, Optional sFile As String = "") If Right(mPath, 1) <> "\" Then ‘开始递归 End Sub
语法:MkDir path 功能:创建一个新的目录或文件夹。 说明:path 可以包含驱动器。如果没有指定驱动器,则 MkDir 会在当前驱动器上创建新的目录或文件夹。 示例: 6、RmDir 语句 语法:RmDir path 功能:删除一个存在的目录或文件夹。 说明:如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用 Kill 语句来删除所有文件。 示例:
RmDir "MYDIR" ‘ 将 MYDIR 删除。 (三)处理文本文件
1、Open 语句 语法:Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 其中access、lock、reclength为可选参数,一般不用。 filenumber 是一个有效的文件号,范围在 1 到 511 之间。可以指定,也可使用 FreeFile 函数可得到下一个可用的文件号。 说明:如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。 示例: 2、Close 语句 语法:Close [filenumberlist] 说明:打开文件后,必须在使用完后关闭文件。 示例: 3、Reset 语句 语法:Reset 功能:关闭所有用 Open 语句打开的磁盘文件。 说明:Reset 语句关闭 Open 语句打开的所有活动文件,并将文件缓冲区的所有内容写入磁盘。 示例: 4、FreeFile 函数 语法:FreeFile[(rangenumber)] 功能:提供一个尚未使用的文件号。 示例: fnum = FreeFile Open "F:\TEST.txt" For Input As #fnum Close #fnum
语法:EOF(filenumber) 功能:返回一个 Integer,它包含 Boolean 值 True,表明已经到达为 Random 或顺序 Input 打开的文件的结尾。 6、LOF 函数 语法:LOF(filenumber) 功能:返回一个 Long,表示用 Open 语句打开的文件的大小,该大小以字节为单位。 7、Loc 函数 语法:LOc(filenumber) 功能:返回一个 Long,在已打开的文件中指定当前读/写位置。
语法:Input #filenumber, varlist 功能:从已打开的顺序文件中读出数据并将数据指定给变量。 说明:通常用 Write # 将 Input # 语句读出的数据写入文件。为了能够用 Input # 语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用 Write # 语句而不使用 Print # 语句。使用 Write # 语句可以确保将各个单独的数据域正确分隔开。 示例: Dim MyString, MyNumber 9、Write # 语句 语法:Write #filenumber, [outputlist] 功能:将数据写入顺序文件。 说明:通常用 Input # 从文件读出 Write # 写入的数据。 用 Write # 将数据写入文件时将遵循几个通用的约定,使得无论什么区域都可用 Input # 读出并正确解释数据: ·在写入数值数据时总使用句号作为十进制分隔符。 ·对于 Boolean 类型的数据,或者打印 #TRUE# 或者打印 #FALSE#。无论在什么地区,都不将 True 和 False 这两个关键字翻译出来。 ·使用通用的日期格式将 Date 类型的数据写入文件中。当日期或时间的部件丢失或为零时,只将现有部分写入文件中。 ·如果 outputlist 的数据为 Empty,则不将任何数据写入文件。但对 Null 数据,则要写入 #NULL#。 ·如果 outputlist 数据为 Null 数据,则将 #NULL# 写入文件中。 ·对于 Error 类型的数据,输出看起来与 #ERROR errorcode# 一样。无论在什么地区,都不将关键字 Error 翻译出来。 示例: Dim MyBool, MyDate, MyNull, MyError 我们可以看到写入的内容为: #FALSE#," is a Boolean value" 10、Line Input # 语句 语法:Line Input #filenumber, varname 功能:从已打开的顺序文件中读出一行并将它分配给 String 变量。 说明:通常用 Print # 与 Line Input # 语句配合使用。 示例: 11、Input 函数 语法:Input(number, [#]filenumber) 功能:返回 String,它包含以 Input 或 Binary 方式打开的文件中的字符。 说明:通常用 Print # 或 Put 将 Input 函数读出的数据写入文件。Input 函数只用于以 Input 或 Binary 方式打开的文件。 示例: 下面这个函数可以将文本文件的数据一次读入到一个字符串(但是若包含中文时会出错,因为一个中文字占2个字节)。 Public Function ReadText(FileName As String) Dim fnum%, isopen As Boolean erro: End Function 12、Print # 语句 语法:Print #filenumber, [outputlist] outputlist 参数的设置如下: Spc(n) 用来在输出数据中插入空白字符,而 n 指的是要插入的空白字符数。
说明:通常用 Line Input # 或 Input 读出 Print # 在文件中写入的数据。 示例: ‘ 赋值 Boolean、Date、Null 及 Error 等。 以上代码写入的内容如下: Zone 1 Zone 2 13、Width # 语句 语法:Width #filenumber, width 功能:将一个输出行的宽度指定给用 Open 语句打开的文件。 示例: 以上代码写入的内容如下:
01234 56789 (四)处理二进制文件
打开二进制文件可以使用Open语句的Random和Binary方式打开。二进制文件读写使用Get和Put语句。 1、Put 语句 语法:Put [#]filenumber, [recnumber], varname recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),指明在此处开始写入。 说明:通常用 Get 将 Put 写入的文件数据读出来。 示例:
语法:Get [#]filenumber, [recnumber], varname recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),以表示在此处开始读出数据。 功能:将一个已打开的磁盘文件读入一个变量之中。 说明:通常用 Put 将 Get 读出的数据写入一个文件。 示例:读取以上代码写入的内容 在立即窗口可以看到如下内容:
语法:Seek [#]filenumber, position 功能:在 Open 语句打开的文件中,设置下一个读/写操作的位置。 说明:可以用Seek语句指定Get语句的读取位置,但在 Get 及 Put 语句中指定的记录号将覆盖由 Seek 语句指定的文件位置。 示例: 4、Seek 函数 语法:Seek(filenumber) 功能:返回一个 Long,在 Open 语句打开的文件中指定当前的读/写位置。 说明:在使用Get语句读取文件时,必须用LOF函数来判断是否到达文件末尾,而不是用EOF函数。可以使用Seek函数判断当前位置,然后与LOF的值比较。 示例:
(五)总结 VBA语句的文件操作涵盖了文件操作的绝大部分内容,很多函数的使用也很简单,一般的文件读写也非常方便,特别是对文本文件。但对于复杂的文件读写,代码的结构和维护性都不好。因此在VB6之后,微软引入了FileSystemObject对象模型,提供了面向对象的类库,来操作驱动器、文件夹和文件。但对于二进制文件的操作,目前还只能用VBA语句。 Excel-VBA操作文件四大方法之三
三、利用FileSystemObject对象来处理文件 FileSystemObject对象模型,是微软提供的专门用来访问计算机文件系统的,具有大量的属性、方法和事件。其使用面向对象的“object.method”语法来处理文件夹和文件,使用起来十分方便(需Office 2000以后版本)。FileSystemObject并不是VBA的一部分,它是以一个COM组件的形式提供的。因此,要使用先要创建FileSystemObject对象。 FileSystemObject对象模型包含了下面的对象和集合: ·FileSystemObject 主对象,包含用来创建、删除和获得有关信息,以及用来操作驱动器、文件夹和文件的方法和属性。 ·Drive 对象,包含用来获得信息的方法和属性,这些信息是关于连接在系统上的驱动器的,如有多少可用空间等。驱动器不一定是硬盘,也可以是CD-ROM、U盘甚至是通过网络在逻辑上连接的硬盘(如公司里部门共享的服务器网络硬盘)。 ·Drives 集合,提供驱动器的列表,这些驱动器以实物或在逻辑上与系统相连接。Drives集合包括所有驱动器,与类型无关。 ·File 对象,包含用来创建、删除或移动文件的方法和属性。 ·Files 集合,提供包含在文件夹内的所有文件的列表。 ·Folder 对象,包含用来创建、删除或移动文件夹的方法和属性。 ·Folders 集合,提供包含在文件夹内的所有文件夹的列表。 ·TextStream 对象,用来读写文本文件。
要使用FileSystemObject对象,先要创建它。创建FileSystemObject对象要使用CreatObject函数。CreateObject 函数用来创建并返回一个对 ActiveX 对象的引用。 语法:CreateObject(class,[servername]) class 参数使用 appname.objecttype 这种语法,包括以下部分: appname 必需的;提供该对象的应用程序名。 因此,我们用下面的代码创建FileSystemObject对象: Dim fso As Object Scripting是类型库的名称,FileSystemObject就是要创建的对象的名字。 同样我们可以创建Dictionary 对象如下:
FileSystemObject对象模型中有些功能是重复的,如可用FileSystemObject对象的CpoyFile方法,也可用File对象的Copy方法来复制文件。下面先介绍FileSystemObject对象的方法。 1、GetDrive 方法 语法:object.GetDrive drivespec drivespec参数可以是一个驱动器字符(c)、一个驱动器字符加一个冒号(c:)、一个驱动器字符加冒号和路径分隔符(c:\)或任何网络共享的说明(\\computer2\share1)。 作用:返回一个与指定路径中的驱动器相对应的 Drive 对象。 示例: 注意:为简洁,示例中都假定fso是已经创建的FileSystemObject对象 2、GetDriveName 方法 语法:object.GetDriveName(path) 作用:返回一个包含指定路径的驱动器名字的字符串。 示例: 3、GetExtensionName 方法 语法:object.GetExtensionName(path) 作用:返回一个包含路径中最后部件扩展名的字符串。 示例: 4、GetBaseName 方法 语法:object.GetBaseName(path) 作用:返回一个包含路径中最后部件的基本名字(去掉任何文件扩展名)的字符串。 示例: 5、GetAbsolutePathName 方法 语法:object.GetAbsolutePathName(pathspec) 作用:从提供的路径说明中返回一个完整、明确的路径。 示例: Debug.Print fs.GetAbsolutePathName("") ‘显示C:\Documents and Settings\yc\My Documents Debug.Print fs.GetAbsolutePathName("c:..") ‘显示C:\Documents and Settings\yc,即上层目录 Debug.Print fs.GetAbsolutePathName("abc") ‘显示C:\Documents and Settings\yc\My Documents\abc Debug.Print fs.GetAbsolutePathName("c:\test.txt") ‘显示C:\test.txt 6、GetFile 方法 语法:object.GetFile(filespec) 作用:返回一个和指定路径中文件相对应的 File 对象。 示例: 7、GetFileName 方法 语法:object.GetFileName(pathspec) 作用:返回指定路径中的最后部件,该路径不是驱动器说明的一部分。 示例: 8、GetFolder 方法 语法:object.GetFolder(folderspec) 作用:返回一个和指定路径中文件夹相对应的 Folder 对象。 示例: 9、GetSpecialFolder 方法 语法:object.GetSpecialFolder(folderspec) 作用:返回指定的特殊文件夹。 说明: WindowsFolder 0 Windows 文件夹,包含由 Windows 操作系统安装的文件。 10、GetParentFolderName 方法 语法:object.GetParentFolderName(path) 作用:返回一个包含指定路径最后部件父文件夹名字的字符串。 示例: 11、GetTempName 方法 语法:object.GetTempName 作用:返回一个随机产生的临时文件或文件夹的名字,该名字在执行需要临时文件或文件夹的操作时有用。 说明:GetTempName 方法不产生一个文件,它仅提供一个临时文件名字,该名字可被 CreateTextFile 用于创建一个文件。 示例: 12、BuildPath 方法 语法:object.BuildPath(path, name) 作用:追加一个名字到一个已经存在的路径。 示例: 13、CreateFolder 方法 语法:object.CreateFolder(foldername) 作用:创建一个文件夹。 注意:如果指定的文件夹已经存在,则发生一个错误。 示例: 14、CopyFolder 方法 语法:object.CopyFolder source, destination[, overwrite] 作用:复制一个文件夹到另一个地方。 说明: 例如:fso.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\" 这是可以的。 ② 如果 source 包含通配符或 destination 以路径分隔符(\)为结尾,则认为 destination 是一个已存在的文件夹,在其中复制相匹配的文件夹和子文件夹。否则认为 destination 是一个要创建的文件夹的名字。 例如:fso.copyfolder "c:\tmp", "f:\abc\" ③如果 destination 是一个已存在的文件,则发生一个错误。 ④如果 destination 是一个目录,它将尝试复制文件夹和它所有的内容。如果一个包含在 source 的文件已在 destination 中存在,当 overwrite 为 False 时发生一个错误,否则它将尝试覆盖这个文件。 ⑤如果 destination 是一个只读目录,当尝试去复制一个已存在的只读文件到此目录并且 overwrite为 False 时,则发生一个错误。 ⑥如果 source 不存在或使用的通配符不能和任何文件夹匹配,也发生一个错误。 ⑦CopyFolder 方法停止在它遇到的第一个错误上,之前所做的操作是不会消失的,所以要注意。 15、MoveFolder 方法 语法:object.MoveFolder source, destination 作用:将一个或多个文件夹从一个地方移动到另一个地方。 说明: ②如果 source 包含通配符或 destination 以路径分隔符 (\) 为结尾,则认为 destination 指定了一个已存在的文件夹,在此文件夹中移动相匹配的文件。否则,认为 destination 是一个要创建的目标文件夹名字。这点与CopyFolder是一样的。 ③如果 destination 是一个已存在的文件,则发生一个错误。 ④如果 destination 是一个目录,则发生一个错误。 ⑤如果 source 不存在或使用的通配符不能和任何文件夹匹配,也发生一个错误。 ⑥MoveFolder 方法停止在它遇到的第一个错误上。不要尝试回卷在错误发生前所做的任何改变。 16、DeleteFolder 方法 语法:object.DeleteFolder folderspec[, force] folderspec 必需的。要删除的文件夹的名字。 Folderspec 可以在最后的路径部件中包含通配符。 作用:删除一个指定的文件夹和它的内容。 说明:如果没有发现相匹配的文件夹,则发生一个错误。DeleteFolder 方法停止在它遇到的第一个错误上,不要尝试回卷或撤消错误发生前所做的任何改变。 示例: 17、FolderExists 方法 语法:object.FolderExists(folderspec) 作用:如果指定的文件夹存在返回 True,不存在返回 False。 18、DriveExists 方法 语法:object.DriveExists(drivespec) 作用:如果指定的驱动器存在,返回 True,如果不存在返回 False。 19、FileExists 方法 语法:object.FileExists(filespec) 作用:如果指定的文件存在,返回 True,若不存在,则返回 False。 20、CreateTextFile 方法 语法:object.CreateTextFile(filename[, overwrite[, unicode]]) overwrite 可选的。Boolean 值,表示一个已存在文件是否可被覆盖。如果可被覆盖其值为 True,其值为 False 时不能覆盖。如果它被省略,则已存在文件不能覆盖。 unicode 可选的。Boolean 值,表示文件是作为一个 Unicode 文件创建的还是作为一个ASCII 文件创建的。如果作为一个 Unicode 文件创建,其值为 True,作为一个 ASCII 文件创建,其值为 False。如果省略的话,则认为是一个 ASCII 文件。 作用:创建一个指定的文件名并且返回一个用于该文件读写的 TextStream 对象。 示例: 21、OpenTextFile 方法 语法:object.OpenTextFile(filename[, iomode[, create[, format]]]) 作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作。 说明: ForReading 1 打开一个只读文件,不能对此文件进行写操作。 注意:在VBA帮助里是没有ForWriting的,其实是有的,VBA帮助也是有错误的。另外,这些常数在使用前要先声明,或者直接用数值。 ·create 可选的,它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件,其值为 True。若不创建文件其值为 False。缺省值为 False。 ·Format 参数可为下面设置值中的任何值: TristateUseDefault –2 使用系统缺省打开文件。 示例: 22、CopyFile 方法 语法:object.CopyFile source, destination[, overwrite] 作用:把一个或多个文件从一个地方复制到另一个地方。 说明:需要注意的地方与CopyFolder是完全类似的。 示例: 23、MoveFile 方法 语法:object.MoveFile source, destination 作用:将一个或多个文件从一个地方移动到另一个地方。 说明:需要注意的地方与MoveFolder是完全类似的。 24、DeleteFile 方法 语法:object.DeleteFile filespec[, force] 作用:删除一个指定的文件。 说明:force 可选的。如果要删除具有只读属性设置的文件,其值为 True。如果其值为 False (缺省),则不能删除具有只读属性设置的文件。
(三)处理驱动器 可以利用Drive对象来获取有关各种驱动器的信息,Drive对象的属性有: TotalSize 属性 驱动器的总容量,以字节为单位。 这些属性的使用都十分简单,直接用“对象.属性”就可以了。在使用前要先用GetDrive获得一个Drive对象,注意不能创建一个驱动器对象。下面举个例子: Sub ShowFreeSpace(drvPath) 利用Call ShowFreeSpace("c:"),即可获得C盘的卷标名和可用空间。 (四)处理文件夹 1、获取文件夹的信息 可以利用Folder对象来获取有关文件夹的信息,Folder对象的属性有: Attributes 属性 文件夹的属性。可为下列值中的任意一个或任意的逻辑组合: 属性的使用和Drive对象是一样的,可以用GetFolder获取一个Folder对象,也可以用FileSystemObject对象的CreateFolder 方法创建一个Folder对象。 2、Folder对象的方法 ⑴Copy 方法 语法:object.Copy destination[, overwrite] 作用:把一个指定的文件夹从一个地方复制到另一个地方。 说明:Copy 方法的作用与FileSystemObject对象的CopyFolder 方法是一样的,不同在于后者可一次复制多个文件夹。 ⑵Move 方法 语法:object.Move destination 作用:将一个指定的文件夹从一个地方移动到另一个地方。 说明:Move 方法的作用与FileSystemObject.MoveFolder 是一样的。不同在于后者可一次移动多个文件夹。 ⑶Delete 方法 语法:object.Delete force 作用:删除一个指定的文件夹。 说明:Delete 方法的作用与FileSystemObject.DeleteFolder 是一样的。 ⑷CreateTextFile 方法 语法:object.CreateTextFile(filename[, overwrite[, unicode]]) 作用:与FileSystemObject对象的CreateTextFile 方法是一样的。 示例:
1、获取文件的信息 可以利用File对象来获取有关文件的信息,File对象的属性和Folder的属性是完全一样的,只是少了Files 属性、IsRootFolder 属性、SubFolders 属性这3个属性。这里就不列了。 2、File对象的方法 ⑴Copy 方法 ⑵Move 方法 ⑶Delete 方法 以上三种方法与Folder的是完全类似的,语法也一样,同样也可用FileSystemObject对象相应的方法代替。 ⑷OpenAsTextStream 方法 语法:object.OpenAsTextStream([iomode, [format]]) 作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用来对文件进行读、写、追加操作。 说明:此方法与FileSystemObject对象的 OpenTextFile 方法相同的功能。参数也是一致的。
1、打开或创建文本文件 打开现有的文本文件,可以使用FileSystemObject对象的 OpenTextFile 方法或File对象的OpenAsTextStream 方法。 2、读取文件 打开文件后,将返回一个TextStream 对象,我们可以利用TextStream 对象的属性及方法来对文件进行读写操作。 先看TextStream 对象的几个属性。 ·AtEndOfLine 属性 文件指针是否正好在行尾标记的前面 利用TextStream 对象读取文件有三种方法。 ·Read 方法 语法:object.Read(characters) 功能:从一个 TextStream 文件中读取指定数量的字符并返回得到的字符串。 示例: ·ReadLine 方法 语法:object.ReadLine 功能:从一个 TextStream 文件读取一整行(到换行符但不包括换行符)并返回得到的字符串。 示例: ·ReadAll 方法 语法:object.ReadAll 功能:读取整个的 TextStream 文件并返回得到的字符串。 说明:对于大的文件,使用ReadAll方法浪费内存资源。应使用其它的技术去输入一个文件,比如按行读取文件。 示例: 还有两个辅助读取的方法: ·Skip 方法 语法:object.Skip(characters) 功能:当读一个 TextStream 文件时跳过指定数量的字符。 示例: ·SkipLine 方法 语法:object.SkipLine 功能:当读一个 TextStream 文件时跳过下一行。
写入数据到文件也有三种方法。 ·Write 方法 语法:object.Write(string) 功能:写一个指定的字符串到一个 TextStream 文件。 示例: ·WriteLine 方法 语法:object.WriteLine([string]) 功能:写入一个指定的字符串和换行符到一个 TextStream 文件中。 示例: ·WriteBlankLines 方法 语法:object.WriteBlankLines(lines) 功能:写入指定数量的换行符到一个 TextStream 文件中。 示例: 4、关闭文件 利用TextStream 对象的Close方法,上面的示例中已经有了,很简单。
从上面的介绍,我们看到使用FileSystemObject对象处理文件、文件夹比使用VBA语句的方法具有更容易存在的特点。这是因为FileSystemObject对象使用了面向对象的语法。另外FileSystemObject对象处理文本文件毫不逊色于VBA语句,非常值得推荐。唯一的问题是不能处理二进制文件,微软在有关文档中称计划将来支持二进制文件,不过应该只是计划而已,呵呵。
之四
四、利用API函数来处理文件 通过前面三种方法的介绍,你是否已经觉得足够了?是的,前面的方法完全可以应付几乎所有的文件操作。但是为了普及一下API,展示一下API的魅力,最后向大家介绍一下如何利用API函数来处理文件。另一方面也是本人对API情有独钟,为她做一下广告,呵呵。 大家对API的强大也是有所耳闻了,在文件操作方面,API自然毫不逊色。 (一)处理驱动器及目录 下面是windows中提供的对于目录进行操作的API函数及其功能: CreateDirectory,CreateDirectoryEx 创建一个新目录 下面通过几个例子来详细的了解一下其中主要的几个函数及其用法: 1、GetLogicalDrives 作用:判断系统中存在哪些逻辑驱动器字母 声明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long 说明:此函数的返回值类型为Long,这个结构中的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推 示例: 上面的示例中,我们通过二进制运算,将返回值转换成字符。如果你的机上有C,D,E,F,G,H这几个驱动器,那么LDs的值就是252,转成二进制为11111100,从右往左,依次代表A,B,C,D,...,为0的说明没有此驱动器字母。大家可以自己试一试。 2、GetDriveType 作用:判断一个磁盘驱动器的类型 声明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long 说明:此函数的返回值类型为Long,如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE(表示磁盘可以从驱动器上移走,通常是软驱), DRIVE_FIXED(磁盘不能从驱动器上移走,通常为本地硬盘), DRIVE_REMOTE(驱动器是远程网络驱动器), DRIVE_CDROM(驱动器是CD-ROM驱动器) 或 DRIVE_RAMDISK(驱动器是RAM驱动器) 示例: Private Const DRIVE_CDROM = 5 ‘表示光盘驱动器
3、GetDiskFreeSpaceEx 作用:获取与一个磁盘的组织以及剩余空间容量有关的信息 声明:Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError. 在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB 参数说明: LARGE_INTEGER结构用来代表一个64位带符号的整数值,它的定义如下: Type LARGE_INTEGER ‘ 8 Bytes 其中lowpart为 Long,指定低32位,highpart 为 Long,指定高32位。 示例:虽然此函数能识别的最大分区容量只有2GB,但通过调整,对大于2G的仍然能得出正确容量。以下的调整公式是本人通过逆向推算出来的,至于其中的原理也不是很清楚,大家可一测试一下。 Private Sub Get_DiskFreeSpaceEx() RootPathName = "d:" Dms = Dms + "磁盘容量:" + vbCrLf ‘取得磁盘可用空间 Dms = Dms + "磁盘可用空间:" + vbCrLf ‘取得磁盘已用空间 Dms = Dms + "磁盘已用空间:" + vbCrLf Dms = Dms + CStr(tempc) + "G" + vbCrLf MsgBox Dms 4、CreateDirectory, CreateDirectoryEx 作用:创建一个新目录 声明: Declare Function CreateDirectoryEx& Lib "kernel32" Alias "CreateDirectoryExA" (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError 参数说明: 示例: 5、RemoveDirectory 作用:移除一个目录 声明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError. 参数说明: 示例: 6、SetCurrentDirectory 作用:设置当前目录,与VBA语句ChDir类似。 声明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long 说明:此函数的返回值类型为Long,非零表示成功,零表示失败。会设置GetLastError 参数说明: 示例: 7、GetSystemDirectory 作用:这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作 声明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 说明:此函数的返回值类型为Long,装载到lpBuffer缓冲区的字符数量。如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度 参数说明: 示例: (二)处理文件
下面是windows中提供的对于文件进行操作的API函数及其功能: CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。
LZOpenFile 打开压缩文件以读取
1、CreateFile 作用:这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台 声明: 说明: 打开一个通信端口时(如COM1),无论如何都要设置成 OPEN_EXISTING。 这个函数代替了lOpen 和 lCreate函数,应该是我们的首选 参数说明: ·lpFileName String,要打开的文件的名字 ·dwFlagsAndAttributes 示例如下: lngHandle = CreateFile("c:\text.txt", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0) ‘上面代码以写方法打开文件,如文件不存在则创建它。 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,欲创建的文件的名字 0——文件能够读写 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 参数说明: lpPathName String,欲打开文件的名字 示例: 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格式 参数说明: 示例: Dim file As Long str1 = "c:\text.txt" 以上代码获取的时间信息是Long型的,还需要时间转换函数进行转换,完整的示例见附件。 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,源文件名
以上代码将c:\test1.txt 拷贝到c:\test2.txt,完整的示例见附件。 6、MoveFile, MoveFileEx 作用:移动文件。如dwFlags设为零,则MoveFile完全等价于MoveFileEx 声明: 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,欲移动的文件名 示例: MoveFile "c:\test.txt", "d:\test1.txt" ‘移动文件 以上代码实现了文件的移动,两次移动後,文件不变 7、DeleteFile 作用:删除指定文件 声明:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError 与vba的kill语句相似,在windows 95下使用这个函数要小心——即使文件当前正由一个应用程序打开,该函数也会将其删除. 参数说明: 示例: DeleteFile "c:\test.txt" ‘删除c:\test.txt文件 完整的示例见附件。 8、ReadFile 作用:从文件中读出数据。与lread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽 声明:Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long 说明:Long,非零表示成功,零表示失败。会设置GetLastError。如启动的是一次异步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早已抵达了文件的结尾 参数: 示例:完整的示例见附件。 9、WriteFile 作用:将数据写入一个文件。该函数比lwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理 声明:Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long 说明:Long,TRUE(非零)表示成功,否则返回零。会设置GetLastError 参数: lpNumberOfBytesWritten - Long,实际写入文件的字节数量 lpOverlapped --- OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值) 示例:完整的示例见附件。
作用:此函数的功能很强大,能对文件或文件夹进行复制、移动、重命名、删除的全部操作。 声明:Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long 说明:Long,TRUE(非零)表示成功,否则返回零。 参数: 示例:见附件。
通过以上的介绍,我们可以看到API在文件操作方面功能十分强大,能够完成一些前面方法所不能完成的任务。FileSystemObject对象模型的内部可能就是用API写的,即便不是我们也可以用API写出一个FSO类来。API是一个巨大的宝库,当你为实现某个功能而愁眉不展的时候,查查API可能就能找到满意的答案。 写的这么多,希望对大家有所帮助,至少操作文件是没有什么问题了。 |
|