"Headroom" on <Files=99> in config.sys

  • Thread starter Thread starter Tim Childs
  • Start date Start date
T

Tim Childs

Hi

As I understand, the command
files=99
in config.sys or config.nt allows 99 files to be open.

How do I know how many have been "used up" and therefore
how many remain to be used, or have I missed the point?

If you need more info then please post back.

Thanks

Tim
 
I thing that setting is obsolete under Windows, Tim. In the old DOS days
machine memory was limited to 640k and you had to worry about allocating it
for various purposes. Each "file" allocated took a little bit. I think you
can safely forget about it. If Config.sys has an entry it's for "legacy"
purposes I would guess. My Config.sys is empty btw.
 
Jim

that's really interesting: we still have this in our set-up at work - I know
because I have a VBA application which broke the limit....

am on Windows XP here at home and, as you say, there is no config file (that
I can find)

but at work the limitation exists and is not easily put right - if I
distribute the application I need to ensure the number of open files is kept
below 99

thanks for responding

Tim
 
Pure speculation follows:

If it's in the config.sys file, then it's a pc wide setting--all
applications(???).

If it's all applications, how can you check to see what's open or even how many
are open?

And with lots of windows applications, files are opened that I never know about
(or even care about). All those DLLs and other external files.

And pulling my old DOS 3.2 manual:

Purpose: This command sets the number of open file handles compatible with
XENIX(R) that the MS-DOS system calls can access.

Syntax: files=<x>

Comments: <x> represents the number of open files handles that the system calls
can access. System calls 2FH throuh 60H are compatible with the XENIX operating
system.

<x> can be any number between 8 and 255. The fault value is 8. Any value
higher than 20 serves no function.

And pulling from my old DOS 5.0 manual (I'm a pack rat!):
Files: Sets the number of files that MS-DOS allows to be open at one time.
In the 5.0 manual, it does say you can have up to 255 files open at one time.

In the 6.0 userguide, it says to refer to the online help. (I _don't_ have that
anymore!)

But I can't imagine that this is important anymore.
 
Doesn't that first link describe a problem with Mac's? The windows info looked
like it was just referring to a utility that helps find what's open--not that it
still causes problems.

It points back to this:
http://ittimes.ucdavis.edu/may2000/348.html

And that has this line at the end:

(By the way, in Macintosh OS 9, Apple boosted the number of simultaneously open
files to 8,169.)

====
I don't think I've had this problem with newer versions (>win95) of windows.
 
Hi Dave,
It addresses open file resources for all the major o/s's.
I spent awhile on google and saw several mentions of the old "out of memory"
problem being traced to "to many open files"

There are several API windows error message constants dealing with "to many
open files", but I didn't see anything about querying for available files.
There must be some or windows wouldn't need an error message.
 
Hi

in this bit of code is where I originally encountered the problem (see
"BOOKMARK" for workaround) and so limited my self to opening just 10 files
at a time, other wise where the range was large (sometimes 1000, i recall)
the error too many files did appear

I hope I have put in all the called functions - the problem is that it has
never been finished off/tidied up

(Dave, you may seem some of your coding in there somewhere!)

Regards

Tim


Option Explicit
Option Compare Text
Option Base 1

Declare Function GetComputerName& Lib "kernel32" _
Alias "GetComputerNameA" (ByVal lbbuffer As String, nsize As Long)

Public vLineInfo As Variant

Sub IterativeRunNBTstat()

Dim RetVal
Dim Temp
Dim lCount As Long 's/b long?
'Temp = Chr(34) & "<03>" & Chr(34) 'for extracting a particular line
Temp = ">"

Dim StartMachineNo As Long
Dim EndMachineNo As Long
Dim lTotalNo As Long
Dim sMachineID As String
Dim lLastRow As Long

StartMachineNo = WorksheetFunction.VLookup("StartNumber",
ThisWorkbook.Sheets("Main").Range("A:B"), 2, False)
EndMachineNo = WorksheetFunction.VLookup("EndNumber",
ThisWorkbook.Sheets("Main").Range("A:B"), 2, False)

If EndMachineNo < 1 Then EndMachineNo = StartMachineNo

lTotalNo = EndMachineNo - StartMachineNo + 1

Dim StartTime
StartTime = Now
lLastRow = GetLastRow(2, 2)
Dim iMaxRange
iMaxRange = 10

For lCount = StartMachineNo To EndMachineNo

sMachineID = "ox" & Right("00" & lCount, 6)

'BOOKMARK
If lTotalNo <= iMaxRange Then
ShellAndWait ("command.com /c nbtstat -a " & sMachineID & " > " &
Environ$("temp") & "\" & sMachineID & ".txt")
Else '10 more machines, no need for delay while NBTSTAT returns an
answer
RetVal = Shell("command.com /c nbtstat -a " & sMachineID & " > " &
Environ$("temp") & "\" & sMachineID & ".txt", 0) ' was 6
'Application.Wait Now() + TimeValue("00:00:04")
End If
Next lCount

If lTotalNo > iMaxRange Then
Do Until Now - StartTime > TimeValue("00:00:10")
Debug.Print "waiting"
Application.Wait Now + TimeValue("00:00:02")
Loop
End If

For lCount = StartMachineNo To EndMachineNo
sMachineID = "ox" & Right("00" & lCount, 6)

ThisWorkbook.Sheets("Main").Cells(lLastRow + lCount - StartMachineNo +
1, 2) = lCount
ThisWorkbook.Sheets("Main").Cells(lLastRow + lCount - StartMachineNo +
1, 3) = sGetNameCharsSAT(Environ$("temp") & "\" & sMachineID & ".txt")
ThisWorkbook.Sheets("Main").Cells(lLastRow + lCount - StartMachineNo +
1, 5) = vLineInfo
ThisWorkbook.Sheets("Main").Cells(lLastRow + lCount - StartMachineNo +
1, 4) = Now()
Next lCount
ThisWorkbook.Sheets("Main").Cells(lLastRow + lCount - StartMachineNo + 1,
2).Select
Debug.Print Format((Now - StartTime), "hh:mm:ss") & " seconds"
'MsgBox sGetNameCharsSAT("C:\Temp\Test2.txt")
End Sub


Function ReturnName1() As String
Dim z As String * 64
GetComputerName z, 64
ReturnName1 = Left(z, InStr(1, z, Chr(0)) - 1)
End Function

Public Function GetLastRow(FirstCol As Integer, LastCol As Integer) As Long

Dim ColLastRow As Long
Dim i As Integer

For i = FirstCol To LastCol
ColLastRow = Columns(i).Find("*", , , , , xlPrevious).Row 'Finds data
cells, not formatted ones..
If ColLastRow > GetLastRow Then GetLastRow = ColLastRow
Next i

End Function

Function sGetNameCharsSAT(sFullFileName As String)
Dim sOutput
Dim iCounter
Dim iPos
Dim iLineNo As Integer
Dim iFileNum As Integer
Dim strTemp As String
Dim Msg As String
Dim sTemp(20) As String
'Environ$("temp") & "\test2.txt "
'get next available file number
iFileNum = FreeFile
'open the file
'Open "C:\windows\desktop\test.txt" For Input As #iFileNum

If FileExists(sFullFileName) = False Then MsgBox "File " & sFullFileName & "
NOT FOUND!!"


Open sFullFileName For Input As #iFileNum
'read the entire first line
On Error Resume Next
Line Input #iFileNum, sTemp(1)

If Err.Number = 62 Then
Close #iFileNum
sOutput = "bombed out"
Else
On Error GoTo 0
If Left(sTemp(1), 4) = "Host" Then
'MsgBox "No data found..."
sGetNameCharsSAT = "Machine not logged onto network"
vLineInfo = ""
Close #iFileNum
Exit Function
End If
On Error Resume Next
For iLineNo = 2 To 18
Line Input #iFileNum, sTemp(iLineNo) 'getting the second line of
input
Next iLineNo
If Err.Number > 0 And Err.Number <> 62 Then MsgBox "Not normal error -
investigate!!"

On Error GoTo 0
'Range("d6") = sTemp2
For iLineNo = LBound(sTemp, 1) To UBound(sTemp, 1)
Debug.Print iLineNo, sTemp(iLineNo)
Next iLineNo

Close #iFileNum
If Left(sFullFileName, 7) = "C:\Temp" Then Kill sFullFileName
For iCounter = 7 To 18
If InStr(1, sTemp(iCounter), "<03>") > 0 Then
iPos = InStr(1, sTemp(iCounter), " ")
sOutput = Left(sTemp(iCounter), iPos - 1) '& " Line " & iCounter
vLineInfo = iCounter '" Line with <03> = " &
'instr(1,
End If
Next iCounter

End If



If sTemp(18) = "" Then sOutput = sOutput & ", line 18 null - NO NT user
logged on"
'prob means machine switched on, no user logged on

sGetNameCharsSAT = sOutput

End Function

Public Function FileExists(StFile As String) As Boolean
FileExists = False
On Error Resume Next
If Dir(StFile) <> "" Then
If Err.Number = 68 Then 'what is Error 68 - look it up
Err.Clear
On Error GoTo 0
Exit Function
Else
FileExists = True
End If
End If
End Function
 
Makes sense about the error message. But with multitasking OSs with lots of
applications running and background processes, too, how many is too many? And I
wonder if files=### would have any affect.

But the way windows work has always pretty much magic to me.
Hi Dave,
It addresses open file resources for all the major o/s's.
I spent awhile on google and saw several mentions of the old "out of memory"
problem being traced to "to many open files"

There are several API windows error message constants dealing with "to many
open files", but I didn't see anything about querying for available files.
There must be some or windows wouldn't need an error message.
 
This looks like magic, too! But if it works, ...

Tim said:
Hi

in this bit of code is where I originally encountered the problem (see
"BOOKMARK" for workaround) and so limited my self to opening just 10 files
at a time, other wise where the range was large (sometimes 1000, i recall)
the error too many files did appear

<<snipped>>
 
Hi Tim,
Sorry, all I see is questions.<vbg>
I see both a shell and shellandwait being used. Both use /c which kills the
command window when done.
Dumping the nbtstat to a text file should only take milliseconds.

The point being, once the process has completed the o/s will close the
file(s).
Doing 1000 files may overload the command processor buffer so doing a pause
in each loop should work.
This may be why you were seeing "to many open files".
If you want to use application.wait I think 1 second is the lowest
resolution.
Using DoEvents won't hurt either.

As a test, do a debug.print timer in each loop to see how long the shell is
taking.


I would suggest adding the sleep API and revising your routine as below.

'(top of module)
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As
Long)


For lCount = StartMachineNo To EndMachineNo
t=timer
sMachineID = "ox" & Right("00" & lCount, 6)

'BOOKMARK

retval = Shell("command.com /c nbtstat -a " & sMachineID & " > " &
Environ$("temp") & "\" & sMachineID & ".txt", 0) ' was 6

DoEvents 'every 10 to 20 files would be better but the overhead cause by the
code might not be worth it.
'To many DoEvents will slow the routine down.
That might be a good thing for you.

Sleep (250) 'unless there is a significant delay in the network this
should get trimmed down to ~20ms based on the timer results.

debug.print timer-t

Next lCount
 
Hi

so is it the case that the problem I encountered is a "mirage" and that it
does not happen on (most) other machines?

regards

Tim
 
Back
Top