Opening More than 15 Files in MS-DOS Version 3.3 and Later
ID: Q31509
|
The information in this article applies to:
-
Microsoft Visual Basic Standard and Professional Editions for MS-DOS, version 1.0
-
Microsoft QuickBASIC for MS-DOS, versions 4.0, 4.0b, 4.5
-
Microsoft BASIC Compiler for MS-DOS, versions 6.0, 6.0b
-
Microsoft BASIC Professional Development System (PDS) for MS-DOS, versions 7.0, 7.1
SUMMARY
To open more than 15 files at once in a Microsoft MS-DOS-based program, you
must do the following:
- Use MS-DOS version 3.3 or later. (You can determine the
MS-DOS version number with the VER command at the command prompt.)
- Add the statement FILES=n to the CONFIG.SYS file.
- Call MS-DOS Interrupt 21 hex with function 67 hex from the
program, as shown in the example listed below.
- If you are using the SHARE.EXE utility, you must also invoke
SHARE/F:nnnnn to increase the area for file-sharing information
above the default of 2048 bytes. See your MS-DOS manual for more
information about the SHARE utility.
The following is an example of using SHARE/F:
share/f:16384
This information is also included with the Help file provided with
the Standard and Professional Editions of Microsoft Visual Basic
for MS-DOS, version 1.0.
MORE INFORMATION
This technique will retain the file handle table size across a CHAIN
for programs compiled without the BC /O option. Programs that are
compiled with the BC /O (stand-alone .EXE) option and CHAINed will
revert to the original file handle table size.
Notes to Keep in Mind
- Even if you follow the above steps and specify FILES=255 in the MS-DOS
CONFIG.SYS file, you may not be able to access that many files at once
in your program because there may not be enough memory available inside
the DGROUP data segment to allocate file buffers.
- Five file handles are taken up by the MS-DOS standard input/output
devices.
- There are memory allocations being done in both the near heap and the
far heap. Applications may run out of memory in the far heap before
they run out on the near heap. If you are doing sequential file access
and use the Len option with a small value when you open the file, you
can reduce the amount of memory allocated for the I/O buffer on the
far heap.
You can also use the Basic SETMEM function to reduce the size of memory
available to Basic as it loads. This method provides more memory to the
operating system, which may be necessary to open more than 15 files at the
same time. If the interrupt call fails with the return code of 8 (in
OUTREGS.AX), indicating insufficient memory, use the SETMEM function to
force Basic to release some memory to MS-DOS to make more memory available
for file handles.
You almost always need to use the SETMEM function if you are calling this
interrupt in an MS-DOS session running in Microsoft Windows (the call to
the interrupt returns with the carry flag set and AX = 8, indicating
insufficient memory). In addition to using SETMEM to run this program under
Microsoft Windows, you must also add/increase "perVMFILES=n", where n is 0
to 255 (default 10) in the [386enh] section of the Windows SYSTEM.INI file.
This entry specifies the number of private file handles that Windows should
allocate to each virtual machine. For this entry to take effect, you must
NOT use the SHARE.EXE utility. If Share is installed, this setting is
ignored.
To call the "set handle count" interrupt, load 67 hex into the AX register,
and load the number of desired handles in the BX register. Under MS-DOS
version 3.3, you must use an odd number ranging from 21 to 255 for the
number of desired handles, because even numbers may make the interrupt
fail. This problem was corrected in MS-DOS version 3.30a. Even or odd
numbers can be used for the number of desired handles when using Interrupt
67h in MS-DOS version 3.30a.
The following is a Basic code example that uses an MS-DOS interrupt to
access more than 20 MS-DOS file handles:
' To run this program in the environment, you must invoke the
' environment with the /L switch to load the default Quick library:
' VBDOS.EXE /L for Visual Basic 1.0 for MS-DOS
' To try this example in VBDOS.EXE:
' 1. From the File menu, choose New Project.
' 2. Copy the code example to the Code window.
' 3. Press F5 to run the program.
' Use the following include file for Visual Basic 1.0 for MS-DOS:
REM $INCLUDE: 'VBDOS.BI'
' Use the following include file for QuickBasic:
REM $INCLUDE: 'QB.BI'
DIM InRegs AS RegType, OutRegs AS RegType
y = SETMEM(-16384) ' Must usually SETMEM in MS-DOS session under
' Windows
InRegs.ax = &H6700 'SetFileHandles function
' Value in BX register must be odd in MS-DOS version 3.3; odd or even
' in later MS-DOS versions; ranging from 21 to 255:
x = 30
InRegs.bx = x 'x is the number of files to open
CALL INTERRUPT(&H21, InRegs, OutRegs)
FOR I% = 1 TO x - 5 'five file handles are reserved for MS-DOS
' standard I/O.
File$ = "Junk" + STR$(I%)
OPEN File$ FOR OUTPUT AS I%
PRINT I%
NEXT
END
Additional query words:
VBmsdos QuickBas BasicCom 3.30 4.00 4.00b 4.50 6.00 6.00b 7.00 7.10
Keywords :
Version : MS-DOS:1.0,4.0,4.0b,4.5; :6.0,6.0b,7.0,7.1
Platform : MS-DOS
Issue type :
|