FoxBASE+使用中的奇怪错误

Author: 成都 冯建军 Date: 1994-01-07

        在使用MODI COMM命令时,指出“读文件错”;使用DIR命令时在记录长度栏显示“不能读文件”;在运行命令程序时,指出“打开文件太多”等一类让人费解的错误。查阅手册,其打开文件个数约定值是十六个之多,使用的也只不过两三个。原因何在呢?原来,FoxBASE+是DOS的基础上工作。它要受DOS的制约。在IBM PC/XT机上,DOS通常默认用户至多可同时打开8个文件。而这8个文件中系统本身就使用了其中5个,因此留给用户的只有3个,这是其一。其二是,如果数据库文件中含有备注型字段,而备注型字段是单独建一个文件。也就是说打开一个含备注型字段的库文件,实际上相当于打开了两个文件。因此出现上述错误。
        要解决这个问题,只需在DOS系统盘,或CCDOS系统盘上建立一个环境设备文件加以修改即可。方法为:
        A>COPY COM CONIG.SYS
        FILES=18
        ^Z
        这样,重新启动后就可以同时打开18-5=13个文件了。同时要注意,打开文件个数不是越多越好。因为,每增加一个,内存就会多开销48字节,使用户可用空间减少48字节。一般是够用就行。
        二、“磁盘满”误判的原因
        在640K内存,双软驱机上,一般是让一级汉字驻留内存,A驱放系统2#盘,B驱放使用盘。有时,FoxBASE+系统能够进入,但几乎不能使用任何命令。只要键入命令就出现“磁盘满”错误。只好退出检查,可B盘剩余2000KB以上,A盘也有近30KB的空间。重新进入,现象依旧。这套系统盘已使用较长时间均为正常,故怀疑病毒。可折腾很长时间,仍不能解决。观察分析后发现,FoxBASE+系统与其它覆盖系统有所不同;其它覆盖系统只存在重复读盘,可以在系统盘上加写保护;而FoxBASE+系统不仅存在重复读盘,还存在重复写盘。它在进入系统时,由SYS(3)函数产生文件名,在系统2#盘上建立一个长度为0的文件,使用命令时就直接在磁盘分配表中占用磁盘空间(由内存中的文件控制块FCB管理),而对文件长度进行修改,最后由QUIT命令收回这些空间。每次需占用大约30K。如果非正常退出,这些空间则 能自动收回。时间长了,就会出现上述现象。
        解决的方法是,利用DOS的CHKDSK命令将这些空间收入文件,再删除*.CHK文件即可收回这些空间。
        三、不能使用“RUN”命令的处理过程。
        “RUN”(或“!”)命令可以使FoxBASE+不退出本系统而执行DOS命令。这是一个很有用的功能。它悬挂FoxBASE+系统,退回到DOS级工作。因此能完成许多FoxBASE+不能完成的功能。即使是FoxBASE+具有相同的功能,使用这一命令执行的速度却快许多。但是,执行该功能有两个条件,一是必须在FOX子目录下存在COMMAND.COM文件。使用DOS的PATH命令和FOX的SET PATH TO设置都无济于事。二是进入FOX前至少有403K的自由内存空间。
        实际使用中,第一个条件是容易满足的。对于第二个条件应用一些技巧。根据笔者的使用有两种情况,对一般双软机使用中通常是将一级汉字驻留内存,这样空间显得紧张。DOS和dBASE-Ⅲ系统都介绍BUFFRES设置得越大则读写缓冲区越大,执行程序时会工作得越快。对于数据库软件,速度问题本身就是一个突出问题,因此普遍把BUFFERS值设置得较大。然而实际使用得知,FoxBASE+系统会自动调整缓冲区的大小,该设置对运行速度不产生影响;而它却对能否使用RUN命令影响较大。原因是一个缓冲区使DOS占用内存增加528字节,而FoxBASE+系统的可使用空间就减少528字节;对于640K内存机型,这几KB内存之差就能决定能否使用“RUN”命令。实践得知,当FILES=15时,BUFFERS应小于22方可使用。
        对于内存1M的机型,一般将扩充内存用来建虚盘放字库,使用213汉字系统,这时一般不是不能用“RUN”命令的。原因是系统自带的213.BAT文件把打印模块,部分高点阵字库等在FoxBASE+系统极少使用的内容也调入了内存,使内存不够。解决的方法是将其213.BAT文件改为:
        echo off
        cls
        c:
        cd\213
        if not exist d:hzk16 copy hzk16 d:
        file3 d2
        cccc
        cv26
        yx1
        key
        lx1
        kwb
        wbzx
        cd\
        echo on
        这样,进入汉字系统后还有478K自由空间;从而不仅可以使用“RUN”命令,而且运行FoxBASE+程序也比以前快许多。
        四、QUIT的意义
        QUIT是FoxBASE+正常退出系统命令。有些用户不常使用该命令,这是不清楚它的功能所造成的。FoxBASE+系统的打印机输出是无缓冲区的直接输出,而磁盘文件的输出是经过缓冲区的输出。简单地说,使用了存盘命令,但实际上并不一定真正存到磁盘上。QUIT命令的第一个功能是将缓冲区的全部内容存盘,避免数据丢失。
        其二是释放磁盘空间。前面谈到FoxBASE+系统与其它覆盖系统有一定区别,其它的覆盖系统只存在重复读盘,系统盘可加写保护,而该系统的2#盘是禁止加写保护的,其原因是它不仅重复读盘而且要重复写盘;它的写盘也与普通的文件存盘不一样,运行过程中可以直接查到系统2#盘上新建一个长度为“0”的文件,但实际上它要占用大约30K的空间。利用QUIT命令,其第二个作用就是释放这些被占用的空间,删除新建的文件。若非正常退出,人为删除该新建文件是不能回收磁盘空间的,只有用CHKDSK命令回收。
        第三,系统为了节省内存,进入时是拆除了常驻的COMMAND.COM文件时,QUIT的第三个作用是释放自己所占用的内存空间,并装回COMMAND.COM文件。
        当然,它还有一个功能就是关闭所有被打开的文件。
        因此,QUIT命令具有“打扫战场”的作用,不能忽视它的使用。
        注:该过程使用的软件是:DOS3.0、CCDOS4.0(或213H0、FoxBASE+2.1等。 (成都  冯建军)