相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
便攜軟件制作的系列教程
2012/3/27 8:27:02 出處:本站原創(chuàng) 人氣:1971次 字號(hào):小 中 大
例1:
設(shè)想某一天,某妞將可移動(dòng)磁盤插入電腦A,電腦A為她的U盤分配了盤符 F: 。該妞使用U盤上的便攜軟件打開了儲(chǔ)存于U盤上的幾個(gè)文檔:
F:\1.doc
F:\2.doc
……
在拔出U盤的時(shí)候,她甚至沒(méi)有為最后一個(gè)文件存檔,反正所有進(jìn)度都會(huì)自動(dòng)保存嘛!
過(guò)了幾日,該妞試圖在電腦B繼續(xù)她的工作,插入U(xiǎn)盤以后,電腦B為她的U盤分配了盤符G: 。當(dāng)她打開便攜軟件的時(shí)候,她會(huì)看到“最近文檔”列表那里顯示著什么呢?
仍然是:
F:\1.doc
F:\2.doc
……
當(dāng)她試圖恢復(fù)上一次”自動(dòng)保存“的文檔,卻提示“找不到……文件”。于是,她發(fā)怒了,發(fā)誓再也不來(lái)你的網(wǎng)站。
這正常嗎?太正常了,上次你就是在F盤打開文件的嘛?墒悄氵能完美地使用“最近文件”列表、繼續(xù)上一次的工作嗎?
我們干革命,就是要勇于把正常變?yōu)椴徽!S谑,我們需要盤符替換。
什么是盤符替換
所謂盤符替換 (Driver Letter Replacement),就是在檢測(cè)到盤符相對(duì)上一次運(yùn)行時(shí)改變的時(shí)候,將某些文件中的舊盤符替換為新盤符,以實(shí)現(xiàn)用戶數(shù)據(jù)的完美銜接。以上述例子為例,就是在盤符轉(zhuǎn)變?yōu)?G: 的時(shí)候,將最近文檔列表替換為:
G:\1.doc
G:\2.doc
……
讓用戶體會(huì)不到盤符改變帶來(lái)的變化,而順利繼續(xù)上一次的工作進(jìn)程。
什么是路徑替換
例2:
設(shè)想某一個(gè)軟件,在配置文件中保存了大量包含軟件路徑的數(shù)據(jù),這些數(shù)據(jù)在軟件首次運(yùn)行時(shí)生成,指向軟件的插件、模板等目錄,假如這些目錄設(shè)置錯(cuò)誤,該軟件便無(wú)法正常運(yùn)行。
而某一天,某妞將該便攜軟件從同盤符的一個(gè)目錄移動(dòng)到另一個(gè)目錄,例如:從 f:\XXXPortable 移動(dòng)到 f:\PortableApps\XXXPortable 。
那么,如何保證該軟件正常運(yùn)行呢?假如包含路徑的設(shè)置項(xiàng)不多,我們可以一個(gè)個(gè)地寫入,而假如類似設(shè)置很多(例如ACDSee),或者數(shù)量不定,難道也要一個(gè)個(gè)寫入嗎?所以,我們需要在檢測(cè)到路徑改變時(shí),將所有的 XXXPortable 替換為 PortableApps\XXXPortable 。
目錄格式
在 PortableApps.com Launcher 中,提供了四種類型的目錄格式,分別是:
%VARIABLE% : 正向單斜杠。例如:%PAL:AppDir% = x:\portableapps\xxxportable\app 。主要應(yīng)對(duì)ini、xml等普通配置文件。
%VARIABLE:ForwardSlash% : 反向單斜杠。例如:%PAL:AppDir:ForwardSlash% = x:/portableapps/xxxportable/app
%VARIABLE:DoubleBackslash% : 正向雙斜杠。例如:%PAL:AppDir:DoubleBackslash% = x:\\portableapps\\xxxportable\\app 。主要應(yīng)用于注冊(cè)表(.reg)文件。
%VARIABLE:java.util.prefs% : 反向多斜杠。例如: %PAL:AppDir:java.util.prefs% = /X:///Portable/Apps///App/Name/Portable///App 。主要應(yīng)用于java程序。
我們需要根據(jù)替換文件的類型選擇相應(yīng)的目錄形式。假如遇到這四種情況以外的目錄形式,則要靠 Custom Code 解決。
實(shí)現(xiàn)原理與流程
為了兼顧例1與例2的兩種情況,避免兩種情況同時(shí)發(fā)生,我們要將盤符替換與路徑替換分開,那就是:先替換盤符,再替換不帶盤符的路徑。
在引導(dǎo)過(guò)程中,讀取上一次記錄的INI文件,判斷是否盤符/路徑改變。
若改變,則讀取上一次的盤符/路徑,轉(zhuǎn)換為正確形式。
讀取當(dāng)前的盤符/路徑,轉(zhuǎn)換為正確形式。
在文件中替換舊盤符為新盤符。
在文件中替換舊路徑為新路徑。
將當(dāng)前的盤符、路徑寫入INI文件,以便下一次讀取。
在 PortableApps.com Launcher 中實(shí)現(xiàn):
以ACDSee Portable為例,我們需要在引導(dǎo)過(guò)程中替換注冊(cè)表文件 HKCU.reg 中的舊盤符\路徑為新。
[FileWrite1]
Type=Replace
File=%PAL:DataDir%\settings\HKCU.reg
Find=%PAL:LastDrive%\\
Replace=%PAL:Drive%\\
[FileWrite2]
Type=Replace
File=%PAL:DataDir%\settings\HKCU.reg
Find=%PAL:LastPackagePartialDir:DoubleBackslash%
Replace=%PAL:PackagePartialDir:DoubleBackslash%
效果如下:
x:\\
替換為:
y:\\
\\xxx\\AppNamePortable
替換為:
\\yyy\\AppNamePortable
請(qǐng)注意,在 [FileWrite1] (盤符替換)中,我在 %PAL:LastDrive% 后面加上了雙斜杠。這是因?yàn)椋?PAL:LastDrive% 是不帶斜杠的(x:)?赡艹霈F(xiàn)這種情況:替換 D:,把 DWORD: 的最后兩個(gè)字母也替換了。難道PortableApps.com的人不擔(dān)心這種情況嗎?我認(rèn)為使用PAL替換盤符的時(shí)候都要注意這一點(diǎn),替換盤符一定要加斜杠。
在 Custom Code 中實(shí)現(xiàn):
PortableApps.com Launcher 是一個(gè)死板的網(wǎng)站的死板的程序員做出的死板的工具,在險(xiǎn)峻難料的革命事業(yè)中,我們要堅(jiān)決摒棄教條主義思想。許多時(shí)候稍有變化,我們就需要用到 Custom Code 。那么,在NSIS語(yǔ)言中怎樣實(shí)現(xiàn)呢?
例如,一個(gè)程序以這樣的形式在 Data\File.txt 記錄路徑:
F__PortableApps_App_Portable
“:”、“\”、“空格”三種符號(hào)都轉(zhuǎn)換為下劃線。讓我們來(lái)寫一段 Custom Code 來(lái)解決它。
${SegmentPrePrimary}
; 替換盤符
; 首先讀取Ini文件中的記錄
ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDrive
; 替換三種符號(hào)為下劃線
${WordReplace} "$0\" "\" "_" "+" "$R0"
${WordReplace} "$R0" ":" "_" "+" "$R0"
${WordReplace} "$R0" " " "_" "+" "$R0"
; 得到當(dāng)前盤符
StrCpy $R1 "$AppDirectory" 3
; 替換三種符號(hào)為下劃線
${WordReplace} "$R1" "\" "_" "+" "$R1"
${WordReplace} "$R1" ":" "_" "+" "$R1"
${WordReplace} "$R1" " " "_" "+" "$R1"
; 在文件中替換
${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1
; 替換路徑
; 首先讀取Ini文件中的記錄
ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDirectory
; 替換兩種符號(hào)為下劃線
${WordReplace} "$0" "\" "_" "+" "$R0"
${WordReplace} "$R0" " " "_" "+" "$R0"
; 得到當(dāng)前路徑(不帶盤符)
StrCpy $R1 "$AppDirectory" "" 2
; 替換兩種符號(hào)為下劃線
${WordReplace} "$R1" "\" "_" "+" "$R1"
${WordReplace} "$R1" " " "_" "+" "$R1"
; 在文件中替換
${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1
!macroend
請(qǐng)注意文件的編碼,如果是 UTF-16LE 編碼,用 ${ReplaceInFileUTF16LECS} 。若需要忽略大小寫,取消最后的“CS”。
在原始NSIS腳本中使用,需要另外:
!include "TextReplace.nsh"
!include "ReplaceInFileWithTextReplace.nsh"
注意事項(xiàng)
盤符與路徑替換是一種簡(jiǎn)單地銜接工作環(huán)境的方法,但我認(rèn)為,在應(yīng)用中需要注意以下幾點(diǎn):
一定要確定你替換的是盤符/路徑,而非別的東西。例如,使用PAL的時(shí)候,在盤符后加入斜杠,替換 x:\ 而不是 x: 。
自行撰寫代碼時(shí),注意所替換文件的編碼。
在替換大文件或多次替換之間,加入Sleep。否則可能遇到替換失敗。
對(duì)于重要路徑,最好在替換后手動(dòng)寫入一次,以保障無(wú)誤。盤符替換依賴INI文件中的記錄,假如一次記錄與實(shí)際銜接不上,可能從此都銜接不上了。
本文導(dǎo)航
- 第1頁(yè): 首頁(yè)
- 第2頁(yè): 盤符替換與路徑替換
- 第3頁(yè): 善用DefaultData