一个自动识别WPS文书文件的函数

Author: 山东 郝桓成 Date: 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程序完成,但稍加修改就可在其它语言中实现。希望本文对编程同行在处理同样问题时有所帮助。