InstallShield内部库函数之9 文件和文件夹函数
文件和文件夹函数提供一个全面的方法来处理文本文件,二进制文件和文件夹。许多函数使用变量TARGETDIR 和SRCDIR作为路径并只接受文件名作为参数。适当时也接受通配符。
ChangeDirectory
使指定的目录为当前目录。
CloseFile
关闭一个打开的文件。
CopyFile
将一个文件从一个文件夹拷贝到另一个。
CreateDir
创建一个新文件夹。
CreateFile
创建一个指定文件名的文件。
DeleteDir
删除一个文件夹。
DeleteFile
删除一个文件。
ExistsDir
确定指定目录是否存在。
ExistsDisk
确定指定磁盘是否存在。
FileCompare
将一个文件和另一个比较。
FileDeleteLine
删除一个文本文件中的一行。
FileGrep
在一个文本文件中查找指定文本。
FileInsertLine
在一个文本文件中插入一行。
FindAllDirs
查找指定文件夹下的所有子文件夹。
FindAllFiles
查找指定文件夹中的所有和一个文件说明匹配的文件和它的子文件夹。
FindFile
查找在指定文件夹中和一个文件说明匹配的第一个文件。
GetFileInfo
检索一个文件的属性,日期,时间和大小。
GetLine
从一个打开的文件中检索一行文本。
OpenFile
打开一现存文件。
OpenFileMode
用OpenFile函数设置文件打开的方式。
ReadBytes
从一个二进制文件中读取指定的字节数。
RenameFile
更名一个文件。
SeekBytes
在一个二进制文件中定位文件指针。
SetFileInfo
设置一个文件的属性,日期和时间。
WriteBytes
在一个二进制文件的当前文件指针位置写入指定数目的字节。
WriteLine
将一个字符串写入一个文本文件。
XCopyFile
将一个或多个文件从一个源文件夹拷贝到一个目标文件夹,如果指定则包括子文件夹。
相关函数
SelectDir
请参阅4.10。
9.1 ChangeDirectory
语法:ChangeDirectory (szPath);
说明:ChangeDirectory函数设置当前目录。
参数:
szPath
指定要被设置为当前目录的目录名。该名可以是一个全限定路径名或一个UNC路径;它必须不包括一个尾随反斜杠。如有必要,在调用ChangeDirectory前调用StrRemoveLastSlash。
返回值:
0:ChangeDirectory成功设置指定目录为当前目录。
< 0:ChangeDirectory未能设置指定目录为当前目录。
注解:
·注意在你调用ChangeDirectory将一个指定目录设为当前目录后,该目录不能被删除。在你可以删除该目录前,你必须再次调用ChangeDirectory来设置一个不同的当前目录。
9.2 CloseFile
语法:CloseFile (nvFileHandle);
说明:CloseFile函数关闭一个已经由调用OpenFile打开的文件。在你关闭一个文件后,你不能从中读或写到该文件。
参数:
nvFileHandle
指定要关闭的文件的句柄。
返回值:
0:表明该函数成功关闭该文件。
< 0:表明该函数未能关闭该文件。
9.3 CopyFile
语法:CopyFile (szSrcFile, szTargetFile);
说明:CopyFile函数创建一个由参数szSrcFile指定的文件的拷贝。新文件由参数szTargetFile指定文件名。
参数:
szSrcFile
指定要拷贝的文件的文件名。如果该文件名是限定的,也就是,如果它包括一个路径,CopyFile将从指定位置拷贝该文件。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,CopyFile将从由系统变量SRCDIR标识的路径拷贝。为拷贝一组文件,在该参数位置使用通配符。
szTargetFile
指定给由szSrcFile标识的文件的拷贝的名称。如果文件名是限定的,也就是,如果它包含一个路径,CopyFile将把文件拷贝到路径指定的位置。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,拷贝将被创建在由系统变量TARGETDIR指定的目录中。如果目标目录不存在,它将被创建。
当由szSrcFile指定的文件名中包含一个通配符时,szTargetFile的文件名部分被忽略;每个源文件以它的现存名被拷贝到由szTargetFile指定的路径。如果szTargetFile包含一个未限定文件名,文件将被拷贝到由系统变量TARGETDIR指定的目录中。因此,CopyFile不能被用来拷贝和重命名一组文件。当szSrcFile包含一个或多个通配符时,源目录和目标目录必须不同。
返回值:
0:表明函数成功地从源目录拷贝文件至目标目录。
< 0:表明函数因下列情况之一未能拷贝所要文件:
COPY_ERR_CREATEDIR (-27):目标目录不能被创建。确保系统变量TARGETDIR中的路径语法正确并且你有权访问目标驱动器。
COPY_ERR_MEMORY (-6):函数未能分配完成拷贝文件进程所需的内存。尽可能多地终止正在运行的应用程序以释放内存。
COPY_ERR_NODISKSPACE (-38):函数未能在目标驱动器上找到足够的磁盘空间来拷贝文件。在目标驱动器上释放磁盘空间。
COPY_ERR_OPENINPUT (-2):函数未能打开系统变量SRCDIR指定的输入文件。确保源文件有一个有效的文件名并且源文件和目标目录都存在。
COPY_ERR_OPENOUTPUT (-3):函数未能拷贝所要文件。
COPY_ERR_TARGETREADONLY (-46):TARGETDIR中的文件是只读文件。删除目标文件的只读属性并重试。
所有其它负值:表明发生一些其它不确定错误。
注解:
·如果你使用未限定文件名并在使用CopyFile时设置SRCDIR和 TARGETDIR的值,在调用CopyFile前用VarSave保存当前值并然后用VarRestore重新设置。如果目标目录不存在,CopyFile创建它。
·你不能通过调用CopyFile时使用通配符来重命名一组文件。然而,单独一个文件时你可以使用CopyFile来做到。
·为包括子目录,调用XcopyFile函数。
·对于文件传输,XCopyFile 是CopyFile的一个完美替换。XCopyFile可以做版本检测,标记锁定的.dll和.exe文件待系统重启后更新,并且递增共享的.dll和.exe文件的注册表访问计数器。
·因为Windows 95及更高版本不允许一个空文件被拷贝,Windows NT不允许创建空文件,CopyFile在这些平台下当被用来拷贝空文件(Size=0KB)时将不工作。
· 在用WriteProfString 或 WriteProfInt修改.ini文件后, Windows 95及更高版本下,你必须在使用CopyFile前刷新高速缓存。所有.ini文件在Windows 95及更高版本下被放在高速缓存中;这种特性可能导致延迟将修改写到指定文件。这接着可能妨碍随后的文件操作。为避免这个问题,简单地以空参数调用WriteProfString来强制Windows 95 及更高版本立即写数据到.ini文件,如下所示:
WriteProfString ("C:\\Test.ini", "Windows", "KeyboardDelay", "100");
file://null string ("") for all four parameters
WriteProfString ("", "", "", "");
file://CopyFile should now have access to updated file.
CopyFile ("C:\\Test.ini", "C:\\Temp\\Test.ini");
9.4 CreateDir
语法:CreateDir (szDirPath);
说明:CreateDir函数在目标驱动器上创建一个或多个子目录。你可以使用一个包含多层子目录的路径,如C:\Programs\Winapps\Myapp。任何路径中不存在的子目录,CreatDir将创建它。例如,如果C:\Programs\Winapps 和 C:\Programs\Winapps\Myapp都不存在,这些子目录将都被CreatDir创建。
参数:
szDirPath
指定要创建的子目录的全限定路径。将路径中的每层用一个反斜杠分隔(通过使用反斜杠转义符(\\))。
返回值:
0:表明函数在目标驱动器上成功创建指定目录或指定目录已经存在。
< 0:表明指定目录不存在并且函数未能创建指定它。
注解:
下列情况下CreatDir将失败:
路径非法;
驱动器或路径上的任何子目录是写保护的;
驱动器名无效;
你没有网络特权来创建子目录。
9.5 CreateFile
语法:CreateFile (nvFileHandle, szPath, szFileName);
说明:CreateFile函数创建一个新文件。如果相同名的文件已经存在,CreateFile改写它。在你用CreateFile创建一个文件前,你必须用OpenFileMode设置文件方式。
CreateFile将新创建的文件打开为读/写(二进制文件)或添加(文本文件)方式,因此你可以使用其它函数,如GetLine, ReadBytes, WriteLine和 WriteBytes.来从文件中读或写到文件中。
除了读/写或添加方式,所有新创建文件自动打开为OF_SHARE_DENY_NONE方式。这意谓着文件被打开为不拒绝其它程序对它的读或写。这种方式的根段记录在Windows OpenFile API中。当你结束从一个文件读或对它写时,你必须使用CloseFile函数来关闭该文件。
参数:
nvFileHandle
返回新文件的句柄。
szPath
指定新文件创建所在的子目录的全限定路径。
szFileName
指定创建的文件的文件名。
返回值:
0:表明函数成功创建新文件。
< 0:表明函数未能创建新文件。
注解:
·CreateFile创建一个新文件并把它打开以便你可以从新文件中读或写到新文件中。为写到一个现存文件中,你必须首先用OpenFileMode 和OpenFile函数以FILE_MODE_APPEND方式打开文件。
·当操作日志被激活时,CreateFile的函数操作不存入到卸载记录中。如果你想要一个由CreatFile创建的文件被存入到卸载记录中,则当存入功能被激活时,使用XcopyFile传输一个启动程序文件(以你要的文件名)到目标系统。你用Enable 和Disable函数激活和禁用存入功能。当存入功能被激活时,XcopyFile操作被存入,启动程序文件被存入后,你可以使用CreatFile和其它文件相关函数来写或改写被存入的启动程序文件。文件名必须保持不变否则它不会在卸载记录中找到。
9.6 DeleteDir
语法:DeleteDir(szDir, nFlag);
说明:DeleteDir函数删除一个子目录。根据你在参数nFlag使用的值,你可以仅当子目录为空时删除它,即使子目录包含文件也删除它,或删除整个根目录。设置nFlag需特别谨慎。
参数:
szDir
指定要被删除的目录的全限定名。
nFlag
指定删除选项。在该参数位置传递下列预定义常量之一:
ALLCONTENTS:删除szDir指定的目录,包括其下的所有子目录和文件。你删除的目录必须是一个子目录,不能是驱动器上的一个根目录。
ONLYDIR:仅当szDir指定的目录为空时才删除它。否则函数失败。
ROOT:即使szDir指定的目录是根目录也要删除它。如果szDir是一个根目录,DeleteDir将删除磁盘上一切东西。
返回值:
0:表明函数成功删除子目录。
< 0:表明函数未能删除子目录。
注解:
·你不能删除当前目录。
·你不能删除一个网络系统上你没有适当权利的文件。
·DeleteDir不能删除只读,隐藏或系统文件。
·如果DeleteDir遇到一个只读文件,该函数可能在只删除子目录中一些文件后失败。
9.7 DeleteFile
语法:DeleteFile (szFile);
说明:DeleteFile函数删除一个或多个文件。注意DeleteFile不能删除只读,隐藏或系统文件。如果你试图删除一个网络系统上你没有适当文件权利的文件时,该函数不起作用。
参数:
szFile
指定要删除文件的名称。如果szFile指定一个全限定名,也就是,包括一个路径,DeleteFile将从指定目录删除该文件。如果szFile包含一个未限定文件名,也就是,没有路径信息,DeleteFile将从由系统变量TARGETDIR指定的目录中删除文件。可以在szFile中包含通配符来删除多个文件。
返回值:
0:表明函数成功删除指定文件。
< 0:表明函数未能删除指定文件。
注解:
你在使用FindFile时可以使用通配符来定位文件然后用DeleteFile删除它们。
9.8 ExistsDir
语法:ExistsDir (szPath);
说明:ExistsDir函数在目标系统上检测指定目录的存在性。
参数:
szPath
指定要在目标系统上找到的目录的全限定路径。
返回值:
EXISTS (0):表明指定目录存在于目标系统上。
NOTEXISTS (-1):表明指定目录不存在于目标系统上。
9.9 ExistsDisk
语法:ExistsDisk (szDisk);
说明:ExistsDisk函数在目标系统上检测指定磁盘驱动器的存在性。
参数:
szDisk
指定磁盘驱动器字符。
返回值:
EXISTS (0):表明目标系统上存在指定驱动器。
NOTEXISTS (-1):表明目标系统上不存在指定驱动器。
9.10 FileCompare
语法:FileCompare (szFileName1, szFileName2, nCompareFlag);
说明:FileCompare函数比较两个文件的大小,日期或版本。
参数:
szFileName1
指定要比较的第一个文件的全限定名。
szFileName2
指定要比较的第二个文件的全限定名。
nCompareFlag
指定比较选项。在该参数位置传递下列预定义常量之一:
COMPARE_SIZE:比较两个文件的大小。
COMPARE_DATE:比较两个文件的日期。
COMPARE_VERSION:比较两个文件的版本资源。
返回值:
EQUALS (2):第一个文件的日期,大小或版本和第二个的相等。
FILE_NOT_FOUND (-2):函数未能找到一个文件或都未能找到。
GREATER_THAN (0):第一个文件比第二个文件更新或更大,根据在参数nCompareFlag使用的常量:
.COMPARE_VERSION
文件一比文件二新。
.COMPARE_DATE
文件一比文件二日期后。
.COMPARE_SIZE
文件一比文件二大。
.LESS_THAN (1)
文件一比文件二旧或小。
OTHER_FAILURE (-1)
发生不确定错误。
9.11 FileDeleteLine
语法:FileDeleteLine (szFileName, nStartLineNum, nEndLineNum);
说明:FileDeleteLine函数从一个文本文件中使用一个起始行和结束行行号来删除该区域的行(包括起始行和结束行)。该函数作用于面向行的文本文件;它不作用于二进制文件。你可以使用FileDeleteLine 和FileGrep函数来查找和删除一个文件中的文本行。
由szFileName指定的文件必须尚未通过调用OpenFile被打开。如果szFileName已经被打开,在调用FileDeleteLine前调用CloseFile。
参数:
szFileName
指定文件的全限定名,它位于系统变量SRCDIR指定的目录中。如果该文件存在,由nStartLineNum 和nEndLineNum指定的行将从该文件中删除。
nStartLineNum
指定要从文件中删除的第一行的行号。注意行从0开始编号。
nEndLineNum
指定要从文件中删除的最后一行的行号。注意行从0开始编号。为了从nStartLineNum指定的行开始删除到文件结尾,给该参数传递预定义常量DELETE_EOF。
返回值:
0:FileDeleteLine从该文件成功删除指定行。
< 0:FileDeleteLine因为下列情况之一而失败:
FILE_NOT_FOUND (-2):InstallShield未能找到szFileName指定的文件。
FILE_RD_ONLY (-5):文件是写保护的。
LINE_NUMBER (-7):一个你所指定的行号小于0,或者文件中没有该行号。
OUT_OF_DISK_SPACE (-6):没有足够的磁盘驱动器空间来完成指定操作。
OTHER_FAILURE (-1):发生其它一些不确定错误。
9.12 FileGrep
语法:FileGrep (szFileName, szSearchStr, svReturnLine, nvLineNumber, nFlag);
说明:FileGrep函数在一个文本文件中查找一个指定字符串。如果字符串被找到,包含该字符串的行被返回到参数svReturnLine,该行的行号被返回到参数nvLineNumber。查找不区分大小写。FileGrep作用于面向行的文本文件;它不作用于二进制文件。
在用FileGrep查找一个文件之前没有必要打开它;你也无须在调用FileGrep之后关闭它。文件打开和文件关闭由FileGrep自动执行。虽然多数情况下,FileGrep对一个已经被打开的文件(先前调用OpenFile的结果)将成功执行,但如果文件是以添加方式打开时,FileGrep将返回FILE_NOT_FOUND。
参数:
szFileName
指定要查找的文件的全限定名。
szSearchStr
指定查找字符串。
svReturnLine
返回szSearchStr被找到的行。
nvLineNumber
返回szSearchStr被找到的行的行号。行以0开始编号。
nFlag
指定查找选项。在该参数位置传递下列预定义常量之一:
CONTINUE:检索查找字符串的下一个出现(如果有)。
RESTART:检索查找字符串的第一次出现。
返回值:
0:FileGrep找到指定字符串。
< 0:FileGrep因下列情况之一而失败:
END_OF_FILE (-4):没有找到查找字符串而已到文件尾。
FILE_NOT_FOUND (-2):InstallShield未能找到szFileName指定的文件。
FILE_LINE_LENGTH (-3):行超过允许的最大长度。
OTHER_FAILURE (-1):发生一个不确定错误。
9.13 FileInsertLine
语法:FileInsertLine (szFileName, szInsertLine, nLineNumber, nInsertFlag);
说明:FileInsertLine函数通过指定行号来插入或置换一行。你可以将FileInsertLine 和 FileGrep一起使用,FileGrep找到行并返回它们的行号。
FileInsertLine工作于面向行的且每行不超过1,024字节的文本文件。InstallShield假定任何长于最大允许长度的行表明了这是一个二进制文件而导致FileInsertLine失败。
由szFileName指定的文件必须尚未通过调用OpenFile被打开。如果szFileName已经被打开,在调用FileInsertLine前调用CloseFile。
参数:
szFileName
指定文件的全限定名,它位于系统变量SRCDIR指定的目录中。如果该文件存在,则将szInsertLine的值插入其中。
szInsertLine
指定插入到文件中的字符串。
nLineNumber
指定你要将szInsertLine插入到的行号。第一行行号是0。
nInsertFlag
指定一个插入位置选项。在该参数位置传递下列预定义常量之一:
BEFORE:在nLineNumber前插入。
AFTER:在nLineNumber后插入。
APPEND;将szInsertLine添加到nLineNumber指定的行。
REPLACE:用szInsertLine 置换nLineNumber指定的行。
返回值:
0:FileInsertLine成功插入行到指定文件。
FILE_LINE_LENGTH (-3):表明行长超过文本文件允许的最大长度。
FILE_NOT_FOUND (-2):FileInsertLine未能找到szFileName指定的文件。
FILE_RD_ONLY (-5):表明文件写保护。
LINE_NUMBER (-7):表明你指定的行号之一小于0,或在文件中不存在该行号。
OUT_OF_DISK_SPACE (-6):表明没有足够的磁盘驱动器空间来完成指定操作。
OTHER_FAILURE (-1):发生一个不确定错误。
9.14 FindAllDirs
语法:FindAllDirs (szDir, nOp, listDirs);
说明:FindAllDirs查找整个磁盘或目录的结构并返回一个子目录名的字符串列表。如果nOp 是INCLUDE_SUBDIR,查找从szDir指定的目录开始并继续查找子目录结构。
参数:
szDir
指定查找的目录名。
nOp
指定是否要查找szDir下的所有子目录。在该参数位置传递下列预定义常量之一:
EXCLUDE_SUBDIR:不包括子目录。
INCLUDE_SUBDIR:包括子目录。
listDirs
返回全限定目录名列表。listDirs标识的字符串列表必须已经通过调用ListCreat被初始化。
返回值:
0:FindAllDirs成功生成子目录名列表。
< 0:FindAllDirs未能生成一个列表。
注解:
·FindAllDirs从指定目录开始查找一个分层子目录结构。如果指定目录是一个根目录并且nOp 包含INCLUDE_SUBDIR,则返回整个磁盘上的所有目录名。你可以使用FindAllDirs来找到一个特定目录的子目录,或你可以使用它来找到一个磁盘上的所有目录。
9.15 FindAllFiles
语法:FindAllFiles (szDir, szFileName, svResult, nOp);
说明:FindAllFiles函数查找一个整个子目录结构并返回第一个有特定文件说明的文件的文件名。如果传递给nOp的变元是RESET,InstallShield在参数szDir指定的目录中开始查找并继续在其子目录结构中查找直到它找到与szFileName匹配的一个文件。如果nOp等于CONTINUE,查找从函数上次被调用时离开的地方继续。重复调用该函数来找到所有出现的与szFileName匹配的文件。
参数:
szDir
指定要查找的目录名。
szFileName
指定要查找的文件说明。该参数允许通配符。
svResult
如果找到则返回第一个匹配文件的全限定名。如果FindAllFiles失败,svResult保持不变。
nOp
指示查找选项。在该参数位置传递下列预定义常量之一:
CONTINUE:在前一个查找停止的位置继续查找。
RESET:在szDir指定的目录开始处开始查找。
CANCEL:释放先前调用FindAllFiles时访问的所有文件和文件夹。运行在Windows NT下的安装中,以该参数调用FindAllFiles来确保随后的对已经由FindAllFiles访问过的文件和文件夹的操作成功。
为找到所有与文件说明匹配的文件,可按下列步骤进行:
将要查找的文件夹名赋给szDir。
将文件说明赋给szFileName,如IS5*.txt。
将nOp设置为RESET,调用FindAllFiles。
当FindAllFiles的返回码是0时,保存svResult返回的文件名;然后调用FindAllFiles, nOp 设置为 CONTINUE.。
最后,运行在Windows NT下的安装中,调用FindAllFiles ,nOp设置为CANCEL
返回值:
0:表明函数检索并返回一个与说明匹配的文件。
< 0:表明函数未能找到一个与说明匹配的文件。
注解:
·该函数从指定目录开始查找一个分层子目录结构。如果指定目录是一个根目录,InstallShiled查找整个磁盘。函数在它找到的第一个匹配文件名处停止。
·第一次你调用该函数来开始一个新的查找,设置nOp为RESET。你可以通过设置nOp为CONTINUE来继续查找指定文件的所有其它出现,并可把该函数调用放在一个循环中,以 FindAllFiles函数失败为结束。
·你不能在一个FindAllFiles(..., RESET)和FindAllFiles(..., CONTINUE) 循环中使用Xcopyfile函数。如果你在一个FindAllFiles循环中调用XcopyFile,由FindAllFiles(..., CONTINUE)返回的文件名可能不正确。
9.16 FindFile
语法:FindFile (szPath, szFileName, svResult);
说明:FindFile函数在一个目录中查找一指定文件。InstallShield在参数svResult返回第一个匹配的文件。
参数:
szPath
指定要查找的目录名。该目录下的子目录不被查找。
szFileName
指定要查找的文件名。该参数允许通配符。
svResult
返回与szFileName匹配的第一个文件的文件名。该参数包含未限定文件名(也就是,不包括驱动器指示符和路径)。
返回值:
0:表明函数成功找到并返回指定文件。
< 0:表明函数未能找到文件。
注解:
·该函数只查找指定子目录。它不查找整个磁盘或目录树。
9.17 GetFileInfo
语法:GetFileInfo (szPathName, nType, nvResult, svResult);
说明:调用GetFileInfo函数来确定一个文件的属性,日期,时间或大小。每个GetFileInfo语句中,你只可以要求这些数据项中的一个。例如,为得到一个文件的日期和时间信息,你必须调用GetFileInfo两次,一次取得日期,一次取得时间。
参数:
szPathName
指定你要检索其信息的文件的全限定名。
nType
指定要检索的信息类型。如果该信息是一个数字,GetFileInfo把它放到nvResult。如果信息是一个字符串,GetFileInfo把它放到svResult。在该参数位置传递下列预定义常量之一:
FILE_ATTRIBUTE:文件属性在nvResult返回。看注解。
FILE_DATE:文件日期以YYYY\MM\DD格式返回到svResult。
FILE_SIZE:大小以字节数返回到nvResult。
FILE_TIME:文件时间以HH:MM:SS格式返回到svResult。
nvResult
返回数值型信息。
svResult
返回字符串型信息。
返回值:
0:表明函数成功检索所需文件信息。
< 0:表明函数未能检索所需文件信息。
注解:
·在以FILE_ATTRIBUTE为第二个参数(nType),调用GetFileInfo后,使用if-then-else逻辑来确定文件属性。如果nvResult = FILE_ATTR_NORMAL,那么没有设置文件属性。如果nvResult <> FILE_ATTR_NORMAL,对nvResult和一个或多个文件属性常量用按位与操作符来确定设置了哪个属性。
if (nvResult = FILE_ATTR_NORMAL) then
file://The file is NORMAL.
else
if (FILE_ATTR_HIDDEN & nvResult) then
file://The file is HIDDEN.
endif;
if (FILE_ATTR_READONLY & nvResult) then
file://The file is READ-ONLY.
endif;
endif;
9.18 GetLine
语法:GetLine (nvFileHandle, svLine);
说明:GetLine函数从一个只读方式打开的文本文件中读取一行。在你调用GetLine之前,你必须首先调用openFileMode来设置文件方式为只读,然后调用OpenFile来打开该文件。对GetLine的第一次调用从文件中读取第一行文本。读取一行后,GetLine把文件指针重新定位到下一行。对GetLine的第二次调用读取第二行,如此继续。GetLine从它返回的行中去除回车和换行字符。
为写到一个文本文件,使用WriteLine函数。WriteLine总是生成在行尾有一个回车和换行字符组合的行。
参数:
nvFileHandle
指定已经由调用OpenFile打开的文件的句柄。
svLine
返回从nvFileHandle指定的文件中返回的一行文本。
返回值:
0:表明函数从一个打开的文本文件中成功检索一行文本。
< 0:表明函数因到文件尾或其它错误情况而失败。这种情况也表明GetLine已经读取了该文件中的所有行。
注解:
·一行的最大长度是4,096个字符。为从一个文件中读取多行,每读一行都单独调用一次GetLine或把GetLine语句放在一个循环中。
·当GetLine已经读取了文件中的所有行,则返回一个文件尾(end-of-file)的错误。注意如果你以添加方式打开一个文件,你调用GetLine函数时将失败因为文件指针在文件尾。如果由nvFileHandle指定的文件以二进制方式打开,则该函数也会失败。
9.19 OpenFile
语法:OpenFile (nvFileHandle, szPath, szFileName);
说明:OpenFile函数打开一个文本文件或二进制文件。在你打开该文件前,你必须通过调用OpenFileMode设置文件方式。
你打开一个文本文件后,调用GetLine 和 WriteLine来对文件读和写。你打开一个二进制文件后,调用ReadBytes 和 WriteBytes来对文件读和写。在对一个二进制文件写之前,你可能需要使用SeekBytes来定位文件指针。
你也可以使用FileGrep, FileInsertLine, 和 FileDeleteLine函数来对文本文件进行查找,读和写。然而,这些函数不要求你打开或关闭文件(这被内部处理)。根据你的需要,这些函数可以提供给你更好的服务。当你用GetLine 或 WriteLine完成对一个文件的读或写后,你必须调用CloseFile函数来关闭该文件。
使用CreateFile来创建一个文件。CreateFile以添加方式(文本文件)或读/写方式(二进制文件)打开新文件。
参数:
nvFileHandle
返回被打开文件的句柄。当你调用InstallShield中其它文件相关函数时,使用该句柄来标识该文件。
szPath
指定你要打开的文件的路径(可能包含一个驱动器指示符)。
szFileName
指定你要打开的文件的未限定名(也就是,没有一个驱动器指示符或路径)。
返回值:
0:表明函数成功打开文件。
< 0:表明函数未能打开文件。
9.20 OpenFileMode
语法:OpenFileMode (nMode);
说明:OpenFileMode函数设置你要打开或创建的文件的方式。你传递给参数nMode的变元设置文件方式为下列之一:
文本文件为添加方式;
文本文件为只读方式;
二进制文件为读/写方式;
二进制文件为只读方式。
你设置文件方式后,调用OpenFile 来打开一个现存文件或调用CreateFile来创建和打开一个新文件。
参数:
nMode
指定以何种方式打开一个文件。在该参数位置传递下列预定义常量之一:
FILE_MODE_APPEND:该常量允许一个文本文件以添加方式被打开或被创建。当一个文件以添加方式由OpenFile打开时,文件指针在文件尾。你可以使用WriteLine函数添加行到文件尾。用CreateFile创建的文件是新的(空的),因此添加到文件中的行被写到文件的开始。注意如果你以添加方式打开一个文件,如果你调用GetLine函数,它会失败,因为文件指针在文件尾。
FILE_MODE_NORMAL:该常量允许一个文本文件以只读方式被打开。当一个文件以只读方式由OpenFile打开时,文件指针在文件头。你可以使用GetLine函数来读文件。当FILE_MODE_NORMAL有效时,用CreateFile创建的文件实际将以FILE_MODE_APPEND方式创建。
FILE_MODE_BINARY:该常量允许一个二进制文件以读/写方式打开或创建。当你用OpenFile 或 CreateFile打开或创建一个二进制方式文件时,你可以调用ReadBytes从该文件读和调用WriteBytes来写到该文件。写到一个二进制文件中时从当前的文件指针位置开始,对于一个新打开或创建的文件该位置是0,即文件的开始。如果你要添加到一个用OpenFile打开的二进制文件时,你必须在写之前使用SeekBytes来定位文件指针。为打开一个CD-ROM或一个只读驱动器上的文件时,调用OpenFileMode来设置文件方式为只读(FILE_MODE_BINARYREADONLY)。
FILE_MODE_BINARYREADONLY:该常量和FILE_MODE_BINARY常量类似,除了它以只读方式打开二进制文件。当打开CD-ROM或只读驱动器上的一个二进制文件时,使用该常量来打开一个二进制文件。FILE_MODE_BINARY会在打开CD-ROM或只读驱动器上的二进制文件时失败。
返回值:
0:表明函数成功设置文件方式。
< 0:表明函数未能设置文件方式。
9.21 ReadBytes
语法:ReadBytes (nFileHandle, svString, nIndex, nBytes);
说明:ReadBytes函数从一个文件中当前文件指针开始读取指定数目的字节。当该函数返回时,InstallShield将文件指针重新定位到从文件中读取字节的结束位置。
你必须调用OpenFileMode 和 OpenFile以二进制方式打开文件,然后才能从中读取。
参数nIndex是svString指定的值中的下标。使用参数nBytes来指定在文件中从参数 nIndex指定处开始读取多少字节。如果nIndex加上nBytes的值大于svString的长度,只从文件中读出字符串中指定下标开始到字符串结尾的字节数。例如,如果svString声明为100个字节长,参数nIndex声明为50字节,参数nBytes为75字节,则只有49到99之间的字节(50个字节,而不是75个字节)被读出。
参数:
nFileHandle
指定以二进制方式打开的文件的文件句柄。
svString
返回从文件中读出的字节。传递给该参数的变量必须已经被声明为显式大小,并且它必须足够大来容纳由nBytes指定数目的字节。
nIndex
指定svString中的一个下标;文件中的数据在这个位置被插入到字符串。
nBytes
指定从文件中读取的字节数。字节从文件指针当前位置开始读取。字节被读取时,InstallShield重新定位文件指针。
返回值:
X:表明函数从文件中成功读取字节,X是实际返回到svString的字节数。
< 0:表明函数未能从文件中读取字节。
9.22 RenameFile
语法:RenameFile (szSrcFile, szTargetFile);
说明:RenameFile函数修改文件名和/或将一个文件从一个目录移动到另一个目录。
参数:
szSrcFile
指定要被更名或移动的文件的文件名。如果szSrcFile指定一个全限定名,也就是,如果它包括一个路径,RenameFile将更名或移动指定目录下的文件。如果szSrcFile包含一个未限定名,也就是,没有路径信息,RenameFile将更名或移动到系统变量SRCDIR指定的目录下的文件。注意不允许通配符;每次调用RenameFile只能更名或移动一个文件。
szTargetFile
为文件指定一个新名和/或新位置。如果szTargetFile指定一个全限定名,也就是,如果它包括一个路径,RenameFile将更名或移动文件到指定目录下。如果szTargetFile包含一个未限定名,也就是,没有路径信息,RenameFile将文件更名或移动到系统变量SRCDIR指定的目录下。看下面的注解。
返回值:
0:表明函数成功修改文件名或移动文件。
< 0:表明函数未能修改文件名或移动文件。
注解:
·如果szSrcFile 和 szTargetFile指向相同目录(或当使用未限定名时,SRCDIR 和 TARGETDIR指向相同目录),则由szSrcFile指定的文件将被更名,除非由szTargetFile指定的文件已经存在于该目录下。
·如果szSrcFile 和 szTargetFile指向不同目录(或当使用未限定名时,SRCDIR 和 TARGETDIR指向不同目录),则由szSrcFile指定的文件将被移动到新目录并命名为由szTargetFile指定的名称,除非由szTargetFile指定的文件已经存在于该目录下。
9.23 SeekBytes
语法:SeekBytes (nFileHandle, nBytes, nPosition);
说明:SeekBytes函数在一个打开的二进制文件中重新定位文件指针。你可以以相对于当前位置或相对于文件头或尾一个特定字节数来移动文件指针。调用SeekBytes前,你必须通过OpenFileMode 和 OpenFile以二进制方式打开文件。当你结束写字节到文件时,调用CloseFile来关闭文件。
参数:
nFileHandle
指定以二进制方式打开的文件的文件句柄。
nBytes
指定文件指针相对于nPosition指定的位置要移动的字节数。如果nBytes是一个整数,文件指针向文件尾移动。如果nBytes是一个负数,文件指针向文件头移动。
nPosition
指定文件中的位置,指针从该位置移动nBytes。在该参数位置传递下列预定义常量之一:
FILE_BIN_CUR:从当前位置开始指针移动nBytes。
FILE_BIN_END:从文件尾开始指针移动nBytes。
FILE_BIN_START:从文件头开始指针移动nBytes。
返回值:
0:表明函数成功重新定位指针。
< 0:表明函数未能重新定位指针。
9.24 SelectDir
请参阅4.10。
9.25 SetFileInfo
语法:SetFileInfo (szPathFile, nType, nAttribute, szValue);
说明:SetFileInfo函数设置一个现存文件的日期或时间,或修改该文件的属性。为修改一个文件的日期和时间,你必须调用SetFileInfo两次,依次修改日期,一次修改时间。然而你可以通过在参数nAttribute位置把常量用或操作符(|)组合起来,仅调用SetFileInfo一次而设置文件的多个属性。
参数:
szPathFile
指定你要修改其日期,时间或属性的文件的全限定名。
nType
指定要修改的文件特性。在该参数位置传递下列预定义常量之一:
FILE_ATTRIBUTE:表明文件的一个或多个属性将被修改。
FILE_DATE:表明文件的日期将被修改。
FILE_TIME:表明文件的时间将被修改。
nAttribute
当nType 是FILE_ATTRIBUTE时,指定文件属性(当nType 是 FILE_DATE 或 FILE_TIME时,给该参数传递0)。为指定多个文件属性,将下列预定义常量用或操作符(|)组合起来:
FILE_ATTR_ARCHIVED:设置存档属性。
FILE_ATTR_HIDDEN:设置隐藏属性。
FILE_ATTR_READONLY:设置只读属性。
FILE_ATTR_SYSTEM:设置系统属性。
FILE_ATTR_NORMAL:当该常量被单独指定时,所有文件属性被清除。当该常量和其它文件属性常量有或操作符组合时,那些不包含在或表达式中的属性被清除。
szValue
指定下列之一:
当nType是FILE_DATE时,以YYYY/MM/DD 或 YYYY\MM\DD格式指定一个日期。该日期必须不早于"1980/01/01"。当使用反斜杠为分隔符时,记住一个反斜杠是作为一个转义符插入到一个字符串中的,如,"1980\\01\\01"。
当nType是FILE_TIME,以HH:MM:SS格式指定一个时间,使用一个24-hour时钟格式;注意秒数必须是2的倍数。
当nType是 FILE_ATTRIBUTE时,给该参数传递一个空字符串。
返回值:
0:表明函数成功设置文件的日期,时间或属性。
< 0:表明函数未能设置文件的日期,时间或属性。
9.26 WriteBytes
语法:WriteBytes (nFile, svString, nIndex, nBytes);
说明:WriteBytes函数写指定数目的字节到一个以二进制方式打开的文件中。该函数从文件指针当前位置开始写字节。在调用WriteBytes前,你必须调用OpenFileMode(FILE_MODE_BINARY) 来打开文件,然后调用OpenFile.。
参数nIndex是svString中的下标。使用参数nBytes来指定从参数 nIndex指定处开始多少字节写到文件中。如果nIndex加上nBytes的值大于svString的长度,InstallShield只将字符串中指定下标开始到字符串结尾的字节数写到文件中。例如,如果svString声明为100个字节长,参数nIndex为50,参数nBytes为75,则只有51到100之间的字节(50个字节,而不是75个字节)被被写到文件中。
参数:
nFile
指定以二进制方式打开的文件的文件句柄。
svString
指定包含要写到输出文件中的字节的字符串变量。
nIndex
指定svString中的一个下标;从该位置开始的字节被写到输出文件。注意第一个字节是在下标位置0。
nBytes
指定你要写到输出文件中的字节数。
返回值:
X:X是实际被写的字节数。
< 0:表明函数未能写这些字节。
9.27 WriteLine
语法:WriteLine (nvFileHandle, szLine);
说明:WriteLine函数将一行文本写到以添加方式打开的文本文件中。在调用WriteLine前,你必须首先用OpenFileMode设置文件方式为添加方式,然后用CreateFile创建文件,或用OpenFile打开文件。该函数把行放置在文件尾。
WriteLine生成行尾有一个回车和换行符的行。为写到一个二进制文件,使用WriteBytes。
该函数不工作于只读方式打开的文件。
参数:
nvFileHandle
指定一个打开文件的文件句柄。句柄从OpenFile 或 CreateFile中获得。
szLine
指定包含要被写到文件中的文本的字符串。
"one" and "This":
不要试图通过在你传递到szLine的字符串中嵌入换行符来写多行。下列代码将字符串写为一行,以一个非打印字符在"one" 和 "This"之间:
szString = "This is line one\nThis is two";
WriteLine(nvFileHandle, szString);
来只调用WriteLine一次而写两行 ,你必须插入一个回车和一个换行符(以这样的次序):
szString = "This is line one\r\nThis is two";
返回值:
0:表明函数将行成功写到文件中。
< 0:表明函数未能将行写到文件中。
注解:
·你可以通过用单引号分隔字符串来在一个字符串中嵌入双引号。例如,如果你想要写字符串"This string contains a double "quotation mark." ",你可以用下列代码:
WriteLine(nvFileHandle, 'This string contains a double "quotation mark."');
9.28 XCopyFile
语法:XCopyFile (szSrcFile, szTargetPath, nOp);
说明:XcopyFile函数将一个或多个文件从源目录拷贝到目标目录。该函数也可以象拷贝文件一样拷贝子目录。当常量INCLUDE_SUBDIR传递到参数nOp时,如有必要, XcopyFile在目标目录上创建子目录。
你不能用XcopyFile重命名文件。为在文件拷贝操作中重命名一个文件,使用CopyFile函数。
参数:
szSrcFile
指定要拷贝的文件。如果该文件名是限定的,也就是,如果它包括一个路径,XCopyFile将从指定位置拷贝文件。如果szSrcFile包含一个未限定文件名,也就是,没有路径信息,CopyFile将从由系统变量SRCDIR标识的路径拷贝。为拷贝多个文件,在该参数位置使用通配符。
szTargetPath
指定由szSrcFile指定的文件要被拷贝的目录。如果该参数包含一个空字符串,文件将被拷贝到由系统变量TARGETDIR指定的目录中。
nOp
指定要执行的拷贝操作类型。在该参数位置传递下列预定义常量之一。为指定多个选项,用或操作符组合常量:
COMP_NORMAL:拷贝文件到目标系统,更新现存的相同名称的文件,不考虑日期,时间或版本信息。
COMP_UPDATE_SAME:更新文件,即使源文件的日期,时间或版本都和目标文件的相同。你必须和该常量一起也指定COMP_UPDATE_DATE 或 COMP_UPDATE_ VERSION,否则,InstallShield忽略该常量。
COMP_UPDATE_DATE:根据文件日期和时间更新文件。如果源文件比目标文件新时,该常量更新文件。
COMP_UPDATE_VERSION:根据文件版本更新文件。如果源文件比目标文件新时,该常量更新文件。如果源文件和目标文件都不存在文件版本时,日期和时间来作比较。如果仅一个文件不存在文件版本,InstallShield假定包含版本信息的文件是较新的文件。
SELFREGISTER:当使用"非批处理方法"安装自注册文件时,立即进行自注册处理。
当你已经调用Enable(SELFREGISTERBATCH),该选项将自注册文件排队等待注册。当使用"批处理方法"安装自注册文件时,一旦调用Do(SELFREGISTRATIONPROCESS),这些文件被登记。总是将SELFREGISTER和常量SHAREDFILE用按位或操作符组合一起使用。
SHAREDFILE:将共享和锁定文件处理组合起来,通过让XcopyFile将所有文件处理为共享并标记锁定的.dll和.exe文件待Windows或系统重启后更新。查看RebootDialog 和 SdFinishReboot。SHAREDFILE选项使XcopyFile将所有文件处理为共享文件,并且当文件存在于目标目录并有一个大于0的访问计数器时,注册表访问计数器自动递增一。如果共享文件不存在于目标目录并没有访问计数器时,InstallShield创建该计数器并设置它为1。如果共享文件已经存在于目标目录但没有访问计数器时,InstallShield创建该计数器并初始化为2作为一个防止卸载过程中意外删除的预防措施。
LOCKEDFILE:使XCopyFile标记锁定的.dll和.exe文件待Windows或系统重启时更新。一个锁定文件是一个当InstallShield试图要访问或更新时而正在被一个应用程序或系统使用的文件。LOCKEDFILE选项和 SHAREDFILE一样工作,除了LOCKEDFILE不创建注册表表目或修改注册表访问计数器。你使用SHAREDFILE选项时不能使用LOCKEDFILE选项。有一些非共享文件,对它们脚本作者不要注册表表目和访问计数器。这些文件除非由应用程序本身,否则永不被卸载。LOCKEDFILE允许XCopyFile处理非共享的锁定文件。
EXCLUDE_SUBDIR:指定不包括在源路径中包含的子目录。
INCLUDE_SUBDIR:指定源路径下的子目录必须也被拷贝。
返回值:
0:表明函数成功拷贝文件。
< 0:表明函数因下列情况之一未能拷贝文件:
COPY_ERR_CREATEDIR (-27):目标目录不能被创建。确保系统变量TARGETDIR中的路径语法正确并且你有权访问目标驱动器。
COPY_ERR_MEMORY (-6):函数未能分配完成拷贝文件进程所需的内存。尽可能多地终止正在运行的应用程序以释放内存。
COPY_ERR_NODISKSPACE (-38):函数未能在目标驱动器上找到足够的磁盘空间来拷贝文件。在目标驱动器上释放磁盘空间。
COPY_ERR_OPENINPUT (-2):函数未能打开系统变量SRCDIR指定的输入文件。确保源文件有一个有效的文件名并且源文件和目标目录都存在。
COPY_ERR_OPENOUTPUT (-3):函数未能拷贝所要文件。
COPY_ERR_TARGETREADONLY (-46):TARGETDIR中的文件是只读文件。删除目标文件的只读属性并重试。
-51:一个自注册文件没有成功注册。
所有其它负值:表明发生一些其它未确定错误。
注解:
·当使用XcopyFile时,若你使用未限定文件名并为SRCDIR 和TARGETDIR设置值时,在调用XcopyFile前调用VarSave保存当前值,然后用VarRestore恢复它们。
·因为Windows 95及更高版本不允许一个空文件被拷贝,Windows NT不允许创建空文件,XCopyFile在这些平台下当被用来拷贝空文件(Size=0KB)时将不工作。
·在用WriteProfString修改.ini文件后, Windows 95及更高版本下,你必须在使用XCopyFile前刷新高速缓存。所有.ini文件在Windows 95及更高版本下被放在高速缓存中;这种特性可能导致延迟将修改写到指定文件。这接着可能妨碍随后的文件操作。为避免这个问题,简单地以空参数调用WriteProfString来强制Windows 95 及其后版本立即写数据到.ini文件,如下所示:
WriteProfString ("C:\\Test.ini", "Windows", "KeyboardDelay", "100");
WriteProfString ("","","",""); file://null string ("") for all four parameters
file://XCopyFile should now have access to updated file.
XCopyFile ("C:\\Test.ini", "C:\\Temp", EXCLUDE_SUBDIR);