MakeRecurentFileList

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


Description

Create file list with relative paths of files in a directory. It is possible to define output file, filter, local and global folder. Local folder and rest path with filename are saved to output file. Global folder is not saved.

Usage

!define UNINSTALL_MAP "uninstall.txt"
Delete "$INSTDIR\${UNINSTALL_MAP}"	; delete output file if exist, there is used append mode
Push "$INSTDIR\${UNINSTALL_MAP}" 	; output file
Push ".pdf"				; filter (only files which has this string in filename are added)
Push "Doc"	 			; local folder
Push "$EXEDIR"	 			; global folder
Call MakeRecurrentFileList

The Function

!include "StrContains.nsh"			; http://nsis.sourceforge.net/StrContains
 
Function MakeRecurrentFileList
	Pop $R3 	; global folder
	Pop $R2		; local folder
	Pop $R1		; filter
	Pop $R0		; output file
 
	ClearErrors
	FindFirst $R4 $R5 "$R3\$R2\*.*"
 
MakeRecurrentFileList_Loop:
	IfErrors MakeRecurrentFileList_Done
	; check if it is folder
	IfFileExists "$R3\$R2\$R5\*.*"  0 MakeRecurrentFileList_file
	; directory
	StrCmp $R5 "." MakeRecurrentFileList_next			; skip current folder
	StrCmp $R5 ".." MakeRecurrentFileList_next			; skip parent folder
	; go Recurrent
	; save current variables
	Push $R5
	Push $R4
	Push $R3
	Push $R2
	Push $R1
	Push $R0
 
	; set parameters
	Push $R0		; output file
	Push $R1		; filter
	Push "$R2\$R5"	; local folder
	Push $R3		; global folder
	call MakeRecurrentFileList
	; restore current variables
	Pop $R0
	Pop $R1
	Pop $R2
	Pop $R3
	Pop $R4
	Pop $R5
	Goto MakeRecurrentFileList_next
 
MakeRecurrentFileList_file:
	; use filter
	${StrContains} $0 $R1 $R5
	StrCmp $0 "" MakeRecurrentFileList_notfound
	; filter found, add file to list
	FileOpen $R6 $R0 a
	FileSeek $R6 0 END
	FileWrite $R6 "$R2\$R5$\r$\n"
	FileClose $R6
 
MakeRecurrentFileList_notfound:
MakeRecurrentFileList_next:
	ClearErrors
	FindNext $R4 $R5
	Goto MakeRecurrentFileList_Loop
 
MakeRecurrentFileList_Done:
	FindClose $R4
FunctionEnd