一个自动识别WPS文书文件的函数 山东 郝桓成 1996-09-20 为了能够让程序运行时自动识别文书文件是否是WPS类型文件,可以编写一个自动识别文件类型的自定义函数。如果是普通的文本文件,则函数返回其文件名,如果是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程序完成,但稍加修改就可在其它语言中实现。希望本文对编程同行在处理同样问题时有所帮助。