FileJoin

From NSIS Wiki
Jump to navigationJump to search
Author: Instructor (talk, contrib)


Page for NSIS 2.07 and below users

You can use the latest version of headers (recommended) or the following function code (put the function code in your script before calling it)

Function Description

____________________________________________________________________________
 
                            FileJoin v1.4
____________________________________________________________________________
 
Thanks Afrow UK (Based on his idea of Function "JoinFiles")
 
 
Join two files in one (File1 + File2 = File3).
 
 
Syntax:
${FileJoin} "[File1]" "[File2]" "[File3]"
 
"[File1]"     ; Input File1
"[File2]"     ; Input File2
"[File3]"     ; Output File3
              ;  If [File3]="" Then add [File2] to [File1]
 
Note:
-Error flag if input files aren't exists
-Error flag if output file path isn't exists


Example1 (Join: a.log + b.log = Z.log):

Section
	${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log"
SectionEnd


Example2 (Add: a.log + b.log = a.log):

Section
	${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log"
SectionEnd

Function Code

Function FileJoin
	!define FileJoin `!insertmacro FileJoinCall`
 
	!macro FileJoinCall _FILE1 _FILE2 _FILE3
		Push `${_FILE1}`
		Push `${_FILE2}`
		Push `${_FILE3}`
		Call FileJoin
	!macroend
 
	Exch $2
	Exch
	Exch $1
	Exch
	Exch 2
	Exch $0
	Exch 2
	Push $3
	Push $4
	Push $5
	ClearErrors
 
	IfFileExists $0 0 error
	IfFileExists $1 0 error
	StrCpy $3 0
	IntOp $3 $3 - 1
	StrCpy $4 $2 1 $3
	StrCmp $4 \ +2
	StrCmp $4 '' +3 -3
	StrCpy $4 $2 $3
	IfFileExists '$4\*.*' 0 error
 
	StrCmp $2 $0 0 +2
	StrCpy $2 ''
	StrCmp $2 '' 0 +3
	StrCpy $4 $0
	goto +3
	GetTempFileName $4
	CopyFiles /SILENT $0 $4
	FileOpen $3 $4 a
	IfErrors error
	FileSeek $3 -1 END
	FileRead $3 $5
	StrCmp $5 '$\r' +3
	StrCmp $5 '$' +2
	FileWrite $3 '$\r$'
 
	;FileWrite $3 '$\r$--Divider--$\r$'
 
	FileOpen $0 $1 r
	IfErrors error
	FileRead $0 $5
	IfErrors +3
	FileWrite $3 $5
	goto -3
	FileClose $0
	FileClose $3
	StrCmp $2 '' end
	Delete '$EXEDIR\$2'
	Rename $4 '$EXEDIR\$2'
	IfErrors 0 end
	Delete $2
	Rename $4 $2
	IfErrors 0 end
 
	error:
	SetErrors
 
	end:
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
FunctionEnd