当前位置: 首页IT技术 → 便携软件制作的系列教程

便携软件制作的系列教程

更多
3 页 善用DefaultData

自从去年心血来潮开了个头,这个教程就一直没了下文,我要用实际行动粉碎虎头蛇尾的谣言,同志们,今天来谈谈 DefaultData。

刚开始制作便携软件的朋友常犯的一个错误是,将软件的默认配置保存到 Data 目录中。何以说是错误呢:

PortableApps.com格式便携软件在安装后,Data目录必须是空的。Data目录中的文件必须在首次运行后生成。

合格的P.A格式便携软件,用户可以随时删除Data目录,将便携软件恢复到初始状态。

因此,如果某些默认配置在软件第一次运行时必须导入,我们应该将它保存到DefaultData目录中。

DefaultData 的诞生

在一个不可考证的从前,John T. Haller 同志(PortableApps.com 的创始人)开始制作他的第一个便携软件:Firefox Portable。在移动介质运行的 Firefox 浏览器应该有如下调整:关闭磁盘缓存,不检测默认浏览器,不设置默认下载目录,同时,他希望在Firefox的默认书签内加入他的网站地址。如何实现以上默认设置的调整呢?

直接修改程序?吃力不讨好。于是,他在 App 目录下新建了 DefaultData 目录,将一份配置好的最简化的配置保存于此。在Firefox首次运行时,DefaultData 目录的内容会被复制到 Data 目录,以实现设置默认配置的目的。于是,今天的 Firefox Portable(以及所有标准P.A格式便携软件)的结构,就成了这个样子:

-\ <--- Directory with FirefoxPortable.exe

+\App\

+\AppInfo\

+\firefox\

+\DefaultData\

+\profile\

+\settings\

+\plugins\

+\Data\

FirefoxPortable.exe

什么是 DefaultData

通过以上叙述我们已经知道,DefaultData 是 PortableApps.com 格式便携软件的标准部件之一,它位于 App\DefaultData ,是软件的默认配置。在首次运行时,它被复制到 Data 目录,DefaultData 内部的文件结构应该和 Data 目录完全一致。

DefaultData 怎样工作?

DefaultData在首次运行时复制到 Data 目录,作为初始的程序配置。判断是否首次运行有几种不同的方式:

Firefox Portable 的方式:

Firefox Portable 通过 NSIS 语言写成,它通过检查 Data\Profile\prefs.js是否存在来判断是否首次运行,假如 Data\Profile\prefs.js 不存在,则复制默认配置到Data目录。这种方式较为灵活,可根据不同软件的具体情况选择不同的判断物:

ProfileWork:

;=== Check for an existing profile

IfFileExists "$PROFILEDIRECTORY\prefs.js" ProfileFound

;=== No profile was found

StrCmp $ISDEFAULTDIRECTORY "true" CopyDefaultProfile CreateProfile

CopyDefaultProfile:

CreateDirectory "$EXEDIR\Data"

CreateDirectory "$EXEDIR\Data\plugins"

CreateDirectory "$EXEDIR\Data\profile"

CreateDirectory "$EXEDIR\Data\settings"

CopyFiles /SILENT $EXEDIR\App\DefaultData\plugins\*.* $EXEDIR\Data\plugins

CopyFiles /SILENT $EXEDIR\App\DefaultData\profile\*.* $EXEDIR\Data\profile

PortableApps.com Launcher 的方式:

PortableApps.com Launcher 通过检查 Data\settings目录是否存在判断首次运行,PAL在运行一次以后必然创建 Data\settings 目录,如果此目录不存在,则判断为首次运行,并复制 DefaultData:

${IfNot} ${FileExists} $EXEDIR\Data\settings

CreateDirectory $EXEDIR\Data\settings

${If} ${FileExists} $EXEDIR\App\DefaultData\*.*

CopyFiles /SILENT $EXEDIR\App\DefaultData\*.* $EXEDIR\Data

${EndIf}

${EndIf}

第三种方式:

在制作具有中国特色的便携软件时,有时会碰到更为复杂的情况。为了保证软件始终从默认配置的基础上启动,我们可以分别判断多个目录,缺少哪一个,就复制哪一个:

例一,

若Data\Profile不存在则复制DefaultData\Profile,若Data\Plugins不存在则复制DefaultData\Plugins:

${IfNot} ${FileExists} $EXEDIR\Data\Profile

CreateDirectory $EXEDIR\Data\Profile

CopyFiles /Silent $EXEDIR\App\DefaultData\Profile\*.* $EXEDIR\Data\Profile

${EndIf}

${IfNot} ${FileExists} $EXEDIR\Data\Plugins

CreateDirectory $EXEDIR\Data\Plugins

CopyFiles /Silent $EXEDIR\App\DefaultData\Plugins\*.* $EXEDIR\Data\Plugins

${EndIf}

例二,

在迅雷便携版中应用到的,检测任何一个 DefaultData 中的目录,如果在 Data 目录中不存在,都复制过去:

Section Main

; ......

; CopyDefaultData:

StrLen $R0 "$EXEDIR\App\DefaultData\"

${Locate} "$EXEDIR\App\DefaultData" "/L=D" CopyDefaultData

; ......

SectionEnd

Function CopyDefaultData

StrCpy $R1 $R9 "" $R0

${IfNot} ${FileExists} "$EXEDIR\Data\$R1"

CreateDirectory "$EXEDIR\Data\$R1"

CopyFiles /Silent "$R9\*.*" "$EXEDIR\Data\$R1"

${Endif}

Push $0

FunctionEnd

DefaultData 能做什么

修改默认配置

例如,在 Evernote Portable 中,将以下内容保存为 App\DefaultData\settings\EvernotePortable.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Evernote\Evernote]

"UpdateToPreReleaseVersion"=dword:00000000

"CheckForUpdatesAtLaunch"=dword:00000000

则会在首次运行时复制为 Data\settings\EvernotePortable.reg ,接着导入注册表,实现默认关闭自动升级的目的。

程序本身的默认/初始配置

通过 Total Uninstall 监测软件安装,可发现某些软件在首次安装后会在配置目录中写入一些文件,这些文件必须放到 DefaultData 目录,以保证程序的完整性,以及让用户随时可以删除 Data 目录恢复软件初始配置。

通过 DefaultData 新建文件夹

在 PortableApps.com Launcher 中,如果你希望使用 FilesMove 来移动文件,必须保证 Data 目录中有这个文件的父目录,否则移动会失败,例如:

[FilesMove]

config\file.txt=%PAL:AppDir%\AppName

在此例中,假如Data\config目录不存在,那么file.txt就无法被移动到Data目录。

解决办法是,创建 App\DefaultData\config ,那么,首次运行时,App\DefaultData\config 会被复制为 Data\config ,以实现新建文件夹的目的。

不过,在大多数情况下,将单个文件保存到 Data\settings 中是更好的方法,PAL会自动创建此文件夹,避免了通过 DefaultData 来创建的麻烦。

其它用途

在制作具有中国特色的便携软件时,有时我们希望一些软件配置永远是“一次性”的(例如广告目录),那么,我们将一份干净的初始配置保存到 DefaultData 中,在每次软件启动时复制到配置目录,在软件结束时删除掉复制的副本。以保证软件的洁净。

注意事项

DefaultData 是 Data 目录的初始状态,其目录、文件结构必须和 Data 目录完全一致。假如你在设计便携软件时设定将注册表导出到 Data\settings\AppNamePortable.reg,那么你应该将默认配置保存为 App\DefaultData\settings\AppNamePortable.reg 。否则无法奏效。

DefaultData 是软件初始配置的一份存档,应该尽量保持精简。仅仅保留最必要的部分。你不应该将整个配置好的 Data 保存为 DefaultData,那样浪费空间,延长首次启动的时间,而应该找出真正有必要的、不可缺少的修改部分,保存为 DefaultData 。如果你的 DefaultData 超过1M,那么就该想想办法了。

DefaultData 应该保留最通用的部分,如果你的 DefaultData 中存在关于你的计算机的信息,例如:installdir=c:\Program Files\AppName ,那么是非常不专业的,我们要严格要求自己。

通过 Total Uninstall 监视软件安装,可发现某些软件自身的默认配置。有时候这些配置很重要(例如一个初始的数据库),请别忘了把它们保存到 DefaultData。

 

热门评论
最新评论
昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)