一个自动识别WPS文书文件的函数
WPS系统生成的文书文件与普通文本文件的不同之处是它有一个1024字节的文件头,其中存放的是文件的WPS版本号、文件长度、所在子目录、定义的块位置、光标位置等相关信息。实际上WPS在编辑(无论是D功能还是N功能)一个文件时总要判定它是否为有1024字节文件头的WPS类文书文件,本文提供的程序中也采用了这种识别方法,就是检查文件的首两字节是否为十六进制字符串01FF、02FF、03FF或04FF,它们分别是WPS1.X、2.X、3.X和WPSNT1.X产生的文书文件。在程序中一次将这两个字节读入整型变量char中,如果它的范围在-256到-251之间则为WPS类型文件,否则不是。这个程序是用VISUAL BASIC语言写成的,函数mkt mpfile$()源程序如下:
FUNCTION mktmpfile$(filename AS STRING)
'如果不是WPS文件,返回原文件名,否则返回生成的TP.TMP文件。
ON LOCAL ERROR GOTO mktmpError '设定错误捕获
DIM char AS INTEGER
filenum%=FREEFILE '取得一个自由的文件号
OPEN filename FOR BINARY ACCESS READ AS filenum% '打开指定文件,如果不是WPS文件,直接返回原文件名,退出函数。
GET filenum%,,char
IF char>-256 AND char<-251 THEN
'IF char+256=4 THEN '此处注释如果有效,则可用以显示其WPS版本号,用以验证程序的结果。
'PRINT "WPS NT 1.X file"
'ELSE PRINT "WPS";STR$(char+256);".X file"
'END IF
SEEK filenum%,1025 '如果是WPS类型文件,文件指针移到第1025字节处,否则关闭文件号,返回原文件名,退出函数。
ELSE
CLOSE filenum%
mktmpfile$=filename
EXIT FUNCTION
END IF
filenum2%=FREEFILE '将WPS类型文件的第二扇区开始写至临时文件内。
OPEN "tp.tmp" FOR BINARY AS filenum2%
WHILE NOT EOF(filenum%)
GET filenum%,,char
PUT filenum2%,,char
WEND
CLOSE filenum%
CLOSE filenum2%
mktmpfile$="tp.tmp"
EXIT FUNCTION
mktmpError:
MSGBOX "读取和转换文件时发生错误!按任一键退出.",0,"错误"
END
END FUNCTION
在实际使用时,只要源程序中涉及到读取文本文件信息的语句(如下例)时,
filenum%=FREEFILE
OPEN filename$ FOR INPUT AS filenum%
均可用下面的语句来代替:
filenum%=FREEFILE
OPEN mktmpfile$(filename$) FOR INPUT AS filenum%
本编程方法已经在笔者所编的实用软件中得到了很好的应用效果。本文虽用BASIC程序完成,但稍加修改就可在其它语言中实现。希望本文对编程同行在处理同样问题时有所帮助。