Lorne,

I thought yours was a good idea and incorporated your ideas into some
existing functions etc,
 But all my ~MAP*.TMP files came up with an attribute code 0f 8224 rather
than 32.  I think that it is a hex number of 2020.

20 seems to be the archive flag, but I really don't understand this stuff at
all.

Any suggestions?

R


-------------------------------------------
Robert Crossley
Agtrix P/L Australia
 
Far Southern Queensland Office:
9 Short Street
PO Box 63 
New Brighton 2483
 
P: 61 2 6680 1309
F: 61 2 6680 5214
E: [EMAIL PROTECTED]
W: www.agtrix.com
 
Brisbane Office:
109 Milsom St
Cooparoo  4151
Queensland
P: 61 7 3843 3363
 
 
 
-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Lorne
Sent: 06 December 2005 21:55
To: 'Hans Wapenaar'
Cc: [email protected]
Subject: RE: [MI-L] temp files not removed

Hello Hans

You probably won't like the details Hans.

There is a documented bug with "Add Column" that I had logged with MI Tech
Support in Nov 2001 (#19823 temporary files created, but not being deleted).
MI will never delete the .tmp files created with that command. Eventually,
your Temp directory contains 9999 files and MI dies.  This could take place
in a single application run if large numbers of .tmp files are being
created.  It could take months with small applications that just create a
few of these .tmp files.

I checked with MI Tech Support this past April and the bug had not been
fixed.  It has been in all versions of MI since at least 5.0.

There does not seem to be an acceptable solution to this problem.  MI tech
support suggested that I write a script to delete all the .tmp files before
running a utility or perhaps after it ends.  There are many reasons why this
is difficult or not a good idea:
  - One has to use API to collect the .tmp names and delete them since the
MB Kill command only operates on a single file.
  - As noted above, it is possible to create more that 10,000 temp files in
a single run - deleting the *.tmp files during a run could result in a crash
since it would be possible to delete files still in use.
  - Other copies of MI could be running and using their own .tmp files which
you would not want to delete.
  - etc.

I have used the delete .tmp files approach in one application.  If you make
sure you only have one copy of MI running and it has just opened (no .tmp
files yet), then you can clear the Temp directory.  The code below is what I
used.  I'm sure you can make it better.

What you really need is a work-around for the Add Column statement

Lorne

  ' ************ '
  '                 WINDOWS API FUNCTION DECLARATIONS
  '                   to allow access to the system 
  '                      File Finding utilities
  ' ************ '

Define MAX_PATH 260
Define ERROR_NO_MORE_FILES 18
Define INVALID_HANDLE_VALUE -1

Type FILETIME
        dwLowDateTime As Integer
        dwHighDateTime As Integer
End Type

Type WIN32_FIND_DATA
        dwFileAttributes As Integer
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Integer
        nFileSizeLow As Integer
        dwReserved0 As Integer
        dwReserved1 As Integer
        cFileName As String * MAX_PATH
        cAlternate As String * 14
End Type

Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" 
     (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As
Integer

Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" 
     (ByVal hFindFile As Integer, lpFindFileData As WIN32_FIND_DATA) As
Integer

Declare Function FindClose Lib "kernel32" Alias "FindClose" (ByVal hFindFile
As Integer) As Integer

' Delete File API
Declare Function DeleteFile Lib "Kernel32.dll" Alias "DeleteFileA" (byVal
lpFileName As String) As Integer

Declare Sub Main()
Declare Sub FilesToArray(ByVal FileSpec As String, FileNames() As String)
Declare Sub DeleteFiles (Path as String, FileNames() as String)
Declare Function StripNulls(OriginalString As String) As String 

Sub Main()
   Dim FileNames() as String
     ' Clear the Windows Temp directory.
     ' Note: Mapinfo does not have a file KILL command that can handle
wildcards.
     '       Use the Windows API
   Temp_Directory = PathToDirectory$(TempFileName$(""))
   Call FilesToArray (Temp_Directory + "~MAP*.TMP", FileNames)
   Call DeleteFiles  (Temp_Directory, FileNames) 
   ReDim FileNames(0)  ' Release the memory
End Sub

' ************ '

Sub FilesToArray(ByVal FileSpec As String, FileNames() As String)
    Dim lRet As Integer
    Dim handle As Integer
    Dim FindData As WIN32_FIND_DATA
    Dim FileName As String
    Dim fileCount As Integer

    ReDim FileNames(0)

    FileCount = 0
       ' the FileSpec argument can contain wildcards, e.g. "C:\*.doc")
 
       ' start the searching, exit if no file matches the spec
    handle = FindFirstFile(FileSpec, FindData)
    If handle < 0 Then
        Exit Function
    End If
    
    Do
        If FindData.dwFileAttributes = 32 Then 
              ' 32 = File that can be deleted... NOT read only.
              ' get this entry's name
           FileName = FindData.cFileName  
              ' Get rid of any NULL characters
           FileName = StripNulls(FileName)

                 ' add this entry to the result
           fileCount = fileCount + 1
           If fileCount > UBound(FileNames) Then
               ' make room in the array if necessary
               ReDim FileNames(FileCount + 100)
           End If

           FileNames(fileCount) = FileName

        End If

            ' read the next file, returns zero when there are no more files
        lRet = FindNextFile(handle, FindData)

    Loop While lRet = 1

        ' stop enumeration
    lRet = FindClose(handle)
    
       ' discard unused array items and return to caller
    ReDim FileNames(FileCount)

End Sub

' ************ '

Function StripNulls(OriginalString As String) As String 

    Dim Null_Position as Integer

    Null_Position = InStr(1, OriginalString, Chr$(0))

    If Null_Position > 0 Then
        OriginalString = Left$(OriginalString, Null_Position - 1)
    End If             

    StripNulls = OriginalString 

End Function 

' ************ '

Sub DeleteFiles (Path as String, FileNames() as String)
   Dim Counter as Integer
   Dim ReturnValue as Integer

   For Counter = 1 to ubound( FileNames)
        ' Mapbasic "Kill" gernerates an error on locked files and one
        ' cannot bypass the message via the OnError routine.
        ' Use the Win API
        '
        '    Kill Path + FileNames(Counter)
      ReturnValue = DeleteFile (Path + FileNames(Counter))

   Next

End Sub

' ************ '

-----Original Message-----
From: Hans Wapenaar [mailto:[EMAIL PROTECTED] 
Sent: December 6, 2005 4:14 AM
To: Lorne
Subject: Re: [MI-L] temp files not removed


Yes indeed, I am using add column in my mapbasic application twice.
Coincidence or not: there are also two temp files for each process that
mapinfo is not removing at all. So I think you are right! Can you forward me
the details?

Thanks a lot

Hans Wapenaar
[EMAIL PROTECTED]

----- Original Message ----- 
From: "Lorne" <[EMAIL PROTECTED]>
To: "'Hans Wapenaar'" <[EMAIL PROTECTED]>
Sent: Saturday, December 03, 2005 1:13 PM
Subject: RE: [MI-L] temp files not removed


> Hello Hans
>
> Are you using the "Add Column" command? If so, there is a
documented error
> concerning that command and I can forward details to you.
>
> Lorne
>
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of
Hans
> Wapenaar
> Sent: November 29, 2005 10:40 AM
> To: [email protected]
> Subject: [MI-L] temp files not removed
>
>
> Hi,
>
> I have written an mapbasic application that is generating map in
batch.
> Unfortunately the application generates loads of tmp files.
Probably more
> than the limit of 10000. At a certain moment mapinfo generates
an error. I
> found out that 'close all' is not removing all tmp files. Some
files remain
> on the disk. Also: the numbering continues where it has stopped.
So when the
> first batch generate 500 tmp files. the next batch starts with
tmp file 501,
> even when several tmpfiles are removed.
>
> Anyone an idea how to manage these temp files? Tips to reduce
the amount of
> remove them during a process?
>
> Hans Wapenaar
> [EMAIL PROTECTED]
_______________________________________________
> MapInfo-L mailing list
> [email protected] 
> http://www.directionsmag.com/mailman/listinfo/mapinfo-l
>
>
_______________________________________________
MapInfo-L mailing list
[email protected]
http://www.directionsmag.com/mailman/listinfo/mapinfo-l


_______________________________________________
MapInfo-L mailing list
[email protected]
http://www.directionsmag.com/mailman/listinfo/mapinfo-l

Reply via email to