The following code was used to create 2000 dummy emails for stress testing an email program. ( You would need to provide dummy email files to pass compile... ) I had four files, a clean pair and a dirty pair. ( not really important, just FYI when you read the code. ) odds became clean, even numbers dirty, in the loop.
The problem was that the program that was being used to call the email filter ( out of scope but C++ gnu compiled. ) used WINAPI's FindFirst, FindNext functions to trigger its activies when a file arrives in the folder.
I was running XP Pro and came upon this nusiance. There is a documented error with WINAPI FindFirst and FindNext such that it fails and returns a null set when the names in the directory are not null terminated properly.
The trigger program was NOT finding these files when I dumped the files made by the following script into the spool.
Renaming the files after they were created caused the trigger program to beable to grab the files.
I altered the script to dump out the file without the /onname feature, and then renamed the file with Rename.
The files were fully functional and worked with the other program without any problem.
Therefour I humbly submit that the output of File /onname fails to add a \0 to the end of the string of the file names.... and it will cause problems when files created by it are scanned or listed or used by other c++ programs.
Can someone please confirm this as a noted bug?
Thanks,
Andrew Wallo
Avid NSIS developer.
Function .onInit
Var /GLOBAL pathHandle
StrCpy $pathHandle "C:\FakeEmailFolder\"
CreateDirectory $pathHandle
Var /GLOBAL counter
Var /GLOBAL oddOrEven
StrCpy $counter "21000"
Var /GLOBAL dtafilename
Var /GLOBAL ctlfilename
SetoutPath $pathHandle
${while} $counter < 22000
IntOp $oddOrEven $counter % 2
StrCpy $dtafilename "0000$counter.dta"
StrCpy $ctlfilename "0000$counter.ctl"
StrCmp $oddOrEven "1" 0 Doclean
; USING FILE ONNAME creates filenames without nullterminated filenames.
;File "/oname= $dtafilename" "DirtyDTAFile.dta"
; HAD TO WRITE OUT AND RENAME TO CREATE WORKAROUND.
File "DirtyDTAFile.dta"
Rename "DirtyDTAFile.dta" $dtafilename
;File "/oname= $ctlfilename" "DirtyCTLFile.ctl"
File "DirtyCTLFile.ctl"
Rename "DirtyCTLFile.ctl" $ctlfilename
Goto LoopAgain
Doclean:
;File "/oname= $dtafilename" "CleanDTAFile.dta"
;File "/oname= $ctlfilename" "CleanCTLFile.ctl"
File "CleanDTAFile.dta"
Rename "CleanDTAFile.dta" $dtafilename
;File "/oname= $ctlfilename" "DirtyCTLFile.ctl"
File "CleanCTLFile.ctl"
Rename "CleanCTLFile.ctl" $ctlfilename
LoopAgain:
IntOp $counter $counter + 1
${endwhile}
FunctionEnd