2012-06-27 50 views
1

NSIS安裝程序創建一個相當大的文件夾結構。當安裝程序啓動時,它會檢查註冊表以查看是否安裝了當前版本...NSIS不備份所有文件

然後它詢問您是否要備份當前文件夾。

它大部分時間都在使用,但有時在備份舊版本時,而不是複製整個目錄,只複製圖標。

!insertmacro un.MoveFolder "$INSTDIR" "${BACKUP_FOLDER}" "*.*" 

參考:http://nsis.sourceforge.net/MoveFileFolder

!insertmacro MoveFolder "$INSTDIR\[path\]source-folder[\]" "$INSTDIR\[path\]destination-folder[\]" "file-mask" 

之後,它移動到刪除部分...

難道它沒有時間去做?它在完成移動之前開始下一個過程?

還有什麼可以進行,以便它不復制整個文件夾?

在安裝程序,我看到

Create folder c:\backup_folder 
Moving files: c:\current_folder\*.* to c:\backup_folder\ 
Delete file: c:\current_folder\file1......... 

和結束時,backup_folder只有圖標(不是所有的文件)

編輯:解決方案 - 請我在這裏NSIS difficulty moving folders後 - $ INSTDIR確實是一個特殊的文件夾,因此我必須將卸載程序移到$ TEMP文件夾中。

回答

1

有什麼理由不能使用內置的CopyFiles命令?

爲了調試這個,我建議你在.MoveFolder_Locate_moveFile函數的頂部附近添加一個DetailPrint。如果您看到所有文件名都過去了,那麼問題就是該函數中的移動操作,否則問題出現在此代碼使用的${Locate}宏中。

另一種方法是用Process Monitor看文件系統操作...

+0

當我正在尋找在進程監視器輸出(偉大的工具!),我注意到的「結果」的「創建文件「BACKUP_FOLDER中每個文件夾的操作都是」NAME COLLISION「。這可能是問題,但我不明白。該文件夾以前不存在,我看不到任何重複的名稱,該程序運行的管理員權限... – Thalia

+0

我認爲問題是,我試圖移動整個INSTDIR(不是它的子目錄) - 是那可能嗎?我非常難以弄清楚如何使用絕對路徑名 - 從INSTDIR名稱構建BACKUP_FOLDER名稱。是否可以將INSTDIR移動/重命名爲INSTDIR_120627? – Thalia

+0

$ instdir並不是特別的,它只是一個字符串; Messagebox mb_ok「$ instdir \ foo \ bar」(但是如果你執行setoutpath $ instdir,那麼windows會保持一個句柄打開(在備份操作之前使用setoutpath $ temp)) – Anders