BBS: Inland Empire Archive Date: 04-12-92 (19:30) Number: 98 From: LOGAN ASHBY Refer#: NONE To: DONALD SUTER Recvd: NO Subj: QB help with disk files? Conf: (2) Quik_Bas
In a msg of <10 Apr 92>, Donald Suter writes to All:
DS > Help please, I have been trying to write a program to sort a
DS > text file of 1+ megs into smaller more manageable files. The file is
DS > to be sorted into app. 34 files. When I run the program it locks up
For some reason, a lot of programming languages limit you to 15 file
handles, no matter what you have in your CONFIG.SYS file.
I don't think this is done by the languages but is a
problem with DOS. Here's a way to bump it up using CALL
Interrupt:
- - - - - - - - - - - - - clip here - - - - - - - - - - - - - - - -
' Logan Ashby - 4/12/92 - public domain code
'$INCLUDE: 'QB.BI'
DIM RegsX AS RegTypeX
CONST MaxFiles% = 40 '| Max. # Files we want open
'| at one time.
RegsX.ax = &H6700 '| DOS Set # of File Handles Func.
RegsX.bx = (MaxFiles% + 5) OR 1 '| Force # File Hnds to an odd #
CALL InterruptX(&H21, RegsX, RegsX)
'| Carry flag set, there was
IF (RegsX.Flags AND 1) THEN '| an error
PRINT "Error in Interrupt Call, DOS Error Code:"; RegsX.ax
END
END IF
FOR i% = 1 TO MaxFiles% '| Now test it.
PRINT "Opening File #"; i%
FileName$ = "FILENUM." + LTRIM$(STR$(i%))
OPEN FileName$ FOR OUTPUT AS #i%
PRINT #i%, "This is FileNum "; i%
NEXT i%
CLOSE
END
- - - - - - - - - - - - - clip here - - - - - - - - - - - - - - - -
This _should_ work with DOS versions 3.3 or later. All the systems I
have access to have DOS 5.0 on them, so I couldn't test it
with earlier versions, but it did work on the ones I tried
it on. You must have FILES in your CONFIG.SYS set at least
five greater than the number of handles you want for this
to work. DOS claims five handles for its own use
internally. The line in the code above where I force the
number of files handles requested to be an odd number is
because of a bug in DOS 3.3 that tries to allocate 64k for
the new file handle table when an even number of handles
are requested.
One bit of weirdness. The first time I tried to run
this in the IDE, it gave me DOS Error Code 8 - Not enough
memory. I rebooted, tried it again, and it worked?!? If
you can't get it to work within the IDE, try compiling it
and see if you have better luck running it from the command
line. Remember to add the /L switch when you start QB for
any code that uses CALL Interrupt(X)
DS > I tried to post this once before, but I think it got lost, if this is
DS > a repeat please forgive me, and answer my question anyway. Thanks.
I saw it the first time but thought someone else would
probably be able to give a better answer, as I've never
needed to do this before. Don't worry, you did the right
thing by hollering until somebody answered. <grin> Hope
this works for you. If you have any questions about the
code, fire off a message, and I'll try to answer them.
seeya,
Logan
--- GoldED 2.31p
* Origin: Lurker's Lounging Point (1:398/1.2)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET