精品久久看,欧美成人久久一级c片免费,日本加勒比在线精品视频,国产一区二区三区免费大片天美,国产成人精品999在线,97理论三级九七午夜在线观看

當前位置: 首頁IT技術 → 便攜軟件制作的系列教程

便攜軟件制作的系列教程

更多
2 頁 盤符替換與路徑替換

例1:

設想某一天,某妞將可移動磁盤插入電腦A,電腦A為她的U盤分配了盤符 F: 。該妞使用U盤上的便攜軟件打開了儲存于U盤上的幾個文檔:

F:\1.doc

F:\2.doc

……

在拔出U盤的時候,她甚至沒有為最后一個文件存檔,反正所有進度都會自動保存嘛!

過了幾日,該妞試圖在電腦B繼續她的工作,插入U盤以后,電腦B為她的U盤分配了盤符G: 。當她打開便攜軟件的時候,她會看到“最近文檔”列表那里顯示著什么呢?

仍然是:

F:\1.doc

F:\2.doc

……

當她試圖恢復上一次”自動保存“的文檔,卻提示“找不到……文件”。于是,她發怒了,發誓再也不來你的網站。

這正常嗎?太正常了,上次你就是在F盤打開文件的嘛。可是你還能完美地使用“最近文件”列表、繼續上一次的工作嗎?

我們干革命,就是要勇于把正常變為不正常。于是,我們需要盤符替換。

什么是盤符替換

所謂盤符替換 (Driver Letter Replacement),就是在檢測到盤符相對上一次運行時改變的時候,將某些文件中的舊盤符替換為新盤符,以實現用戶數據的完美銜接。以上述例子為例,就是在盤符轉變為 G: 的時候,將最近文檔列表替換為:

G:\1.doc

G:\2.doc

……

讓用戶體會不到盤符改變帶來的變化,而順利繼續上一次的工作進程。

什么是路徑替換

例2:

設想某一個軟件,在配置文件中保存了大量包含軟件路徑的數據,這些數據在軟件首次運行時生成,指向軟件的插件、模板等目錄,假如這些目錄設置錯誤,該軟件便無法正常運行。

而某一天,某妞將該便攜軟件從同盤符的一個目錄移動到另一個目錄,例如:從 f:\XXXPortable 移動到 f:\PortableApps\XXXPortable 。

那么,如何保證該軟件正常運行呢?假如包含路徑的設置項不多,我們可以一個個地寫入,而假如類似設置很多(例如ACDSee),或者數量不定,難道也要一個個寫入嗎?所以,我們需要在檢測到路徑改變時,將所有的 XXXPortable 替換為 PortableApps\XXXPortable 。

目錄格式

在 PortableApps.com Launcher 中,提供了四種類型的目錄格式,分別是:

%VARIABLE% : 正向單斜杠。例如:%PAL:AppDir% = x:\portableapps\xxxportable\app 。主要應對ini、xml等普通配置文件。

%VARIABLE:ForwardSlash% : 反向單斜杠。例如:%PAL:AppDir:ForwardSlash% = x:/portableapps/xxxportable/app

%VARIABLE:DoubleBackslash% : 正向雙斜杠。例如:%PAL:AppDir:DoubleBackslash% = x:\\portableapps\\xxxportable\\app 。主要應用于注冊表(.reg)文件。

%VARIABLE:java.util.prefs% : 反向多斜杠。例如: %PAL:AppDir:java.util.prefs% = /X:///Portable/Apps///App/Name/Portable///App 。主要應用于java程序。

我們需要根據替換文件的類型選擇相應的目錄形式。假如遇到這四種情況以外的目錄形式,則要靠 Custom Code 解決。

實現原理與流程

為了兼顧例1與例2的兩種情況,避免兩種情況同時發生,我們要將盤符替換與路徑替換分開,那就是:先替換盤符,再替換不帶盤符的路徑。

在引導過程中,讀取上一次記錄的INI文件,判斷是否盤符/路徑改變。

若改變,則讀取上一次的盤符/路徑,轉換為正確形式。

讀取當前的盤符/路徑,轉換為正確形式。

在文件中替換舊盤符為新盤符。

在文件中替換舊路徑為新路徑。

將當前的盤符、路徑寫入INI文件,以便下一次讀取。

在 PortableApps.com Launcher 中實現:

以ACDSee Portable為例,我們需要在引導過程中替換注冊表文件 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

請注意,在 [FileWrite1] (盤符替換)中,我在 %PAL:LastDrive% 后面加上了雙斜杠。這是因為,%PAL:LastDrive% 是不帶斜杠的(x:)。可能出現這種情況:替換 D:,把 DWORD: 的最后兩個字母也替換了。難道PortableApps.com的人不擔心這種情況嗎?我認為使用PAL替換盤符的時候都要注意這一點,替換盤符一定要加斜杠。

在 Custom Code 中實現:

PortableApps.com Launcher 是一個死板的網站的死板的程序員做出的死板的工具,在險峻難料的革命事業中,我們要堅決摒棄教條主義思想。許多時候稍有變化,我們就需要用到 Custom Code 。那么,在NSIS語言中怎樣實現呢?

例如,一個程序以這樣的形式在 Data\File.txt 記錄路徑:

F__PortableApps_App_Portable

“:”、“\”、“空格”三種符號都轉換為下劃線。讓我們來寫一段 Custom Code 來解決它。

${SegmentPrePrimary}

; 替換盤符

; 首先讀取Ini文件中的記錄

ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDrive

; 替換三種符號為下劃線

${WordReplace} "$0\" "\" "_" "+" "$R0"

${WordReplace} "$R0" ":" "_" "+" "$R0"

${WordReplace} "$R0" " " "_" "+" "$R0"

; 得到當前盤符

StrCpy $R1 "$AppDirectory" 3

; 替換三種符號為下劃線

${WordReplace} "$R1" "\" "_" "+" "$R1"

${WordReplace} "$R1" ":" "_" "+" "$R1"

${WordReplace} "$R1" " " "_" "+" "$R1"

; 在文件中替換

${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1

; 替換路徑

; 首先讀取Ini文件中的記錄

ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDirectory

; 替換兩種符號為下劃線

${WordReplace} "$0" "\" "_" "+" "$R0"

${WordReplace} "$R0" " " "_" "+" "$R0"

; 得到當前路徑(不帶盤符)

StrCpy $R1 "$AppDirectory" "" 2

; 替換兩種符號為下劃線

${WordReplace} "$R1" "\" "_" "+" "$R1"

${WordReplace} "$R1" " " "_" "+" "$R1"

; 在文件中替換

${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1

!macroend

請注意文件的編碼,如果是 UTF-16LE 編碼,用 ${ReplaceInFileUTF16LECS} 。若需要忽略大小寫,取消最后的“CS”。

在原始NSIS腳本中使用,需要另外:

!include "TextReplace.nsh"

!include "ReplaceInFileWithTextReplace.nsh"

注意事項

盤符與路徑替換是一種簡單地銜接工作環境的方法,但我認為,在應用中需要注意以下幾點:

一定要確定你替換的是盤符/路徑,而非別的東西。例如,使用PAL的時候,在盤符后加入斜杠,替換 x:\ 而不是 x: 。

自行撰寫代碼時,注意所替換文件的編碼。

在替換大文件或多次替換之間,加入Sleep。否則可能遇到替換失敗。

對于重要路徑,最好在替換后手動寫入一次,以保障無誤。盤符替換依賴INI文件中的記錄,假如一次記錄與實際銜接不上,可能從此都銜接不上了。

本文導航
熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
主站蜘蛛池模板: 欧美日本片 | 色综合久久中文 | 玖玖国产精品视频 | 国内第一永久免费福利视频 | 丁香花在线免费高清观看 | 91av亚洲| 国内自拍偷拍网 | 日本激情在线观看 | 亚洲天堂国产精品 | 深爱五月激情五月 | a一区二区三区视频 | 久久精品国产亚洲a | 成人伊人青草久久综合网 | 非会员体验60秒试看福利区 | 黄色免费在线视频 | 99日精品欧美国产 | 色黄视频在线观看 | 黄色小视频在线观看 | 久久久久久久久久综合情日本 | 激情文学综合 | 成人在线视频网站 | 国产97色在线 | 日韩 | 免费国产成人高清网站app | 久久久婷婷亚洲5月97色 | 五月婷婷色 | 欧美一级日韩在线观看 | 岛国搬运工一区二区免费 | 日韩a一级欧美一级 | 成人免费毛片一区二区三区 | 久久国产精品-国产精品 | 2021最新国产精品一区 | 国产片最新大片免费看 | 婷婷激情综合 | 男女视频网 | 五月天精品在线 | 久久成人影视 | 九九视频只有精品六 | 日韩欧美成人免费中文字幕 | 国产末成年女av片 | 麻豆国产在线视频 | 五月激情婷婷综合 |