文件和目录(Apache OpenOffice 运行时库)

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png

使用文件是应用程序的一项基本任务。Apache OpenOffice API 为您提供了各种对象,用以创建、打开和修改 Office 文档。Apache OpenOffice API 简介中详细介绍了这些对象。尽管如此,在某些情况下,您必须直接访问文件系统、搜索目录或编辑文本文件。Apache OpenOffice Basic 中的运行时库提供了一些基本函数以完成这些任务。

Documentation note.png Apache OpenOffice 中不再提供某些 DOS 特有的文件和目录函数,或者其功能非常有限。例如,不提供对 ChDirChDriveCurDir 函数的支持。要求将文件属性作为参数的函数中不再使用某些 DOS 特有的属性(例如,将隐藏文件与系统文件区分开)。为确保实现最高的 Apache OpenOffice 平台独立性级别,必须进行此更改。

管理文件

搜索目录

Apache OpenOffice Basic 中的 Dir 函数负责从目录中搜索文件和子目录。首次发出请求时,必须将一个字符串作为第一个参数赋值给 Dir,该字符串中包含要搜索的目录的路径。Dir 的第二个参数指定要搜索的文件或目录。Apache OpenOffice Basic 返回找到的第一个目录条目的名称。要检索下一个条目,应在不使用参数的情况下请求 Dir 函数。如果 Dir 函数未找到其他条目,则会返回空字符串。

以下示例说明了如何使用 Dir 函数请求位于某个目录中的所有文件。该过程将各个文件名保存在 AllFiles 变量中,然后在消息框中显示此变量。

Sub ShowFiles
  Dim NextFile As String
  Dim AllFiles As String
 
  AllFiles = ""
  NextFile = Dir("C:\", 0)
 
  While NextFile  <> ""
    AllFiles = AllFiles & Chr(13) &  NextFile 
    NextFile = Dir
  Wend
 
  MsgBox AllFiles
End Sub

通过将 0 (零)用作 Dir 函数中的第二个参数,可以确保 Dir 仅返回文件名而忽略目录。可以在此处指定以下参数:

  • 0:返回常规文件
  • 16:子目录

以下示例几乎与上一示例完全相同,只是 Dir 函数将值 16 作为参数传送,该函数返回文件夹的子目录而不是文件名。

Sub ShowDirs
  Dim NextDir As String
  Dim AllDirs As String
 
  AllDirs = ""
  NextDir = Dir("C:\", 16)
 
  While NextDir <> ""
    AllDirs = AllDirs & Chr(13) &  NextDir
    NextDir  <nowiki>= Dir</nowiki>
  Wend
 
  MsgBox AllDirs
End Sub
Documentation note.png 在 Apache OpenOffice Basic 中请求时,使用参数 16 的 Dir 函数仅返回文件夹的子目录。在 VBA 中,该函数还会返回标准文件的名称,因此,要仅检索目录,还需要进行进一步检查。在使用 CompatibilityMode ( true ) 函数时,Apache OpenOffice Basic 的操作与 VBA 类似,使用参数 16 的 Dir 函数将返回子目录和标准文件。
Documentation note.png VBA 提供了专门用于在目录中搜索具有隐藏系统文件归档以及卷名属性的文件的选项,Apache OpenOffice Basic 中未提供这些选项,因为并非所有操作系统上都提供相应的文件系统函数。
Documentation note.png Dir 中列出的路径规范可以使用 * 和 ? 占位符,这对 VBA 和 Apache OpenOffice Basic 同样适用。不过,在 Apache OpenOffice Basic 中,* 占位符只能是文件名和/或文件扩展名的最后一个字符,而在 VBA 中并非如此。

创建和删除目录

Apache OpenOffice Basic 提供了用于创建目录的 MkDir 函数。

MkDir ("C:\SubDir1")

此函数可以创建目录和子目录。如果需要,还会在分层结构中创建所需的所有目录。例如,如果仅存在 C:\SubDir1 目录,则调用

MkDir ("C:\SubDir1\SubDir2\SubDir3\")

会同时创建 C:\SubDir1\SubDir2 目录和 C:\SubDir1\SubDir2\SubDir3 目录。

RmDir 函数可以删除目录。

RmDir ("C:\SubDir1\SubDir2\SubDir3\")

如果目录中包含子目录或文件,则也会删除这些目录或文件。因此,应谨慎使用 RmDir

Documentation note.png 在 VBA 中,MkDirRmDir 函数仅与当前目录有关;而在 Apache OpenOffice Basic 中,MkDirRmDir 可用于创建或删除多级目录。
Documentation note.png 在 VBA 中,如果目录中包含文件,RmDir 将生成错误消息;而在 Apache OpenOffice Basic 中,将删除该目录及其所有文件。如果使用的是 CompatibilityMode ( true ) 函数,则 Apache OpenOffice Basic 的操作与 VBA 类似。

复制、重命名和删除文件以及检查文件是否存在

以下调用将使用名称 Destination 创建 Source 文件的副本:

FileCopy(Source, Destination)

通过使用以下函数,可以将 OldName 文件重命名为 NewNameAs 关键字语法以及不使用逗号的做法可追溯到 Basic 语言的起源。

Name OldName As NewName

以下调用将删除 Filename 文件。如果要删除目录(包括其文件),请使用 RmDir 函数。

Kill(Filename)

FileExists 函数可用于检查文件是否存在:

If FileExists(Filename) Then 
  MsgBox "file exists."
End If

读取和更改文件属性

在使用文件时,能够确定文件属性、上次更改文件的时间以及文件长度有时非常重要。

以下调用将返回一些有关文件的属性。

Dim Attr As Integer
Attr = GetAttr(Filename)

返回值是作为位掩码提供的,其中可以包含以下值:

  • 1:只读文件
  • 16:目录名称

以下示例可确定 test.txt 文件的位掩码,并检查它是只读文件还是目录。如果都不适用,则将 "normal" 字符串赋值给 FileDescription

Dim FileMask As Integer
Dim FileDescription As String
 
FileMask = GetAttr("test.txt")
 
If (FileMask AND 1) > 0 Then
  FileDescription = FileDescription & " read-only "
End IF
 
If (FileMask AND 16) > 0 Then
  FileDescription = FileDescription & " directory "
End IF
 
If FileDescription = "" Then
  FileDescription = " normal "
End IF
 
MsgBox FileDescription
Documentation note.png Apache OpenOffice Basic 不支持 VBA 中用于查询隐藏系统文件、归档卷名文件属性的标志,因为它们是 Windows 特有的标志,其他操作系统上不提供这些标志,或者仅提供一部分标志。

SetAttr 函数允许更改文件属性。因此,可以使用以下调用为文件提供只读状态:

SetAttr("test.txt", 1)

可通过以下调用删除现有的只读状态:

SetAttr("test.txt", 0)

FileDateTime 函数提供了上次更改文件的日期和时间。此处,将按照系统上使用的特定于国家/地区的设置来设置日期格式。

FileDateTime("test.txt")   ' Provides date and time of the last file amendment.

FileLen 函数以字节为单位确定文件长度(作为长整型值)。

FileLen("test.txt")      ' Provides the length of the file in bytes

写入和读取文本文件

Apache OpenOffice Basic 提供了各种读取和写入文件的方法。以下说明与使用文本文件(不是文本文档)有关。

写入文本文件

在访问文本文件之前,必须先打开该文件。为此,需要一个可用文件句柄,该句柄清楚地标识要随后访问的文件。

FreeFile 函数用于创建可用文件句柄。句柄用作 Open 指令的一个参数,该指令可以打开文件。要打开文件以将其指定为文本文件,请使用 Open 调用:

Open Filename For Output As #FileNo

Filename 是一个包含文件名的字符串。FileNoFreeFile 函数创建的句柄。

在打开文件后,可以逐行描述 Print 指令:

Print #FileNo, "This is a test line."


                   此处的 FileNo 还表示文件句柄。第二个参数指定的文本将保存为文本文件中的一行。

在完成写入过程后,必须使用 Close 调用关闭该文件:

Close #FileNo

此处同样应该指定文件句柄。

以下示例说明了如何打开、描述和关闭文本文件:

Dim FileNo As Integer
Dim CurrentLine As String
Dim Filename As String
 
Filename = "c:\data.txt"            ' Define file name 
FileNo = Freefile               ' Establish free file handle
 
Open Filename For Output As #FileNo         ' Open file (writing mode)
Print #FileNo, "This is a line of text"      ' Save line 
Print #FileNo, "This is another line of text"   ' Save line 
Close #FileNo                  ' Close file

读取文本文件

文本文件的读取方式与其写入方式相同。用于打开文件的 Open 指令包含 For Input 表达式(取代了 For Output 表达式);应使用 Line Input 指令读取数据,而不是使用 Print 命令写入数据。

最后,在调用文本文件时,将使用 eof 指令检查是否到达了文件的末尾:

eof(FileNo)

以下示例说明了如何读取文本文件:

Dim FileNo As Integer
Dim CurrentLine As String
Dim File As String
Dim Msg as String
 
' Define filename 
Filename = "c:\data.txt"
 
' Establish free file handle
FileNo = Freefile
 
' Open file (reading mode)
Open Filename For Input As FileNo
 
' Check whether file end has been reached
Do While not eof(FileNo)
  ' Read line 
  Line Input #FileNo, CurrentLine   
  If CurrentLine <>"" then
    Msg = Msg & CurrentLine & Chr(13)
  end if
Loop
 
 
' Close file 
 
Close #FileNo               
Msgbox Msg

通过 Do While 循环检索各个行,将这些行保存在 Msg 变量中,最后在消息框中显示这些行。

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools