文件管理器新配置文件格式详解
前言
文件管理器是一个复杂的项目,集成了很多的功能。功能多了,自然也就有了对功能定制的需求。在之前的版本中,主要是使用QSettings来读写配置文件,但是,有些配置项需要在修改后实时同步到其它进程,QSettings无法满足这样的需求。并且,由于没有提供一个统一的设置项读写入口,在添加功能时,往往会使用一个新的配置文件来存储数据,导致项目中配置文件碎片化严重,管理和记录都很困难。为了解决这个问题,在1.8版本中统一了配置文件的格式和程序中的读写入口。
配置文件
文件格式
{
"Group1": {
"Key1": Value1,
...
"KeyN": ValueN
},
...
"GroupN": {
"Key1": Value1,
...
"KeyN": ValueN
}
}
根为一个JSON Object,称之为根对象。其中的每一项都是一个JSON Object,称之为组对象。组对象中的值没有限制,可以为任何JSON数据。
组对象
根对象中的每一项都是一个存储组,用于划分存储区域。其中Key为组名,使用大驼峰式命名法,子类型可以使用”/”分割组名,如:”Deepin/FileManager”。值必须是一个对象。
普通组名使用大写英文字母开头,另外还有以 “” 开头且结尾的组为私有组,不能用于配置项的存储,命名风格使用“下划线命名法”。此版本中使用了一个私有组 “metadata” 用于记录配置文件的扩展信息,和普通组一样,”metadata” 也是一个对象,其中值 “version” 用于记录配置文件的格式版本,方便以后更新配置文件格式时对旧版本做出兼容。此外,和普通组同名的键值用于配置此普通组,例如:
{
"Example": {
"key1": "value1",
"key2": "value2"
},
"__metadata__": {
"version": "1.0",
"Example": {
"keyOrdered": ["key2", "key1"]
}
}
}
在 “metadata” 中有一个和组”Example”同名的值,有一个属性为 “keyOrdered”,用于定义组 “Example” 中值的顺序。
值对象
组对象中的每一项都是一个值对象,用于存储具体的数据。其中Key为值的名称,一般使用小驼峰式命名法,不过,因为值可以在运行时由程序自由添加,且无法固定来源,所以对于此类值的名称没有约束。
存储位置
一个配置文件的结构分为三层:
默认
用于定义配置项的默认值(初始化值),放在Qt的资源文件中,不可修改或删除。
系统
系统级别的配置,适用于任意用户,另外又分为:应用程序系统配置、通用系统配置。一个是具体应用的专属配置,另一个是通用配置,供文件管理器基础库使用。优先级高于默认配置,内容只读,通过编辑文件手动更改后,应用不会重新加载此文件。
用户
用户级别的配置,可读可写,且和系统级配置一样分为:应用程序用户配置、通用用户配置。优先级高于系统配置,应用程序中对配置项的所有改动最终都会存储到此配置文件中。对文件内容的改动也可以实时更新到应用程序中。
文件管理器的配置项
文件管理器中使用DFMSettings读写配置文件,默认在DFMApplication中提供了四个DFMSettings对象:
* genericSetting
* appSetting
* genericObtuselySetting
* appObtuselySetting
genericSetting 用于存储应用程序无关的通用配置,且关心文件变化,实时同步内容。
appSetting 用于存储应用的独特配置,且关心文件变化,实时同步内容。
genericObtuselySetting 用于存储应用程序无关的通用配置,对文件内容改变不敏感。
appObtuselySetting 用于存储应用的独特配置,对文件内容改变不敏感。
内容结构
├── appSetting
│ └── ApplicationAttribute
│ ├── AllwayOpenOnNewWindow
│ ├── IconSizeLevel
│ ├── ViewMode
│ ├── ViewComppactMode
│ ├── ViewAutoCompace
│ ├── OpenFileMode
│ ├── UrlOfNewWindow
│ ├── UrlOfNewTab
│ └── ThemeName
├── genericObtuselySetting
│ ├── MenuActions
│ │ └── disable
│ ├── Disk/Volume
│ ├── Disk/Custom
│ ├── HiddenFiles
│ │ ├── pattern1
│ │ ├── ...
│ │ └── patternN
│ └── PrivateFiles
│ ├── pattern1
│ ├── ...
│ └── patternN
├── genericSetting
│ ├── GenericAttribute
│ │ ├── QuickSearch
│ │ ├── PreviewCompressFile
│ │ ├── PreviewTextFile
│ │ ├── PreviewDocumentFile
│ │ ├── PreviewImage
│ │ ├── PreviewVideo
│ │ ├── AutoMount
│ │ ├── AutoMountAndOpen
│ │ ├── OverrideFileChooserDialog
│ │ ├── ShowedHiddenOnSearch
│ │ ├── ShowedHiddenFiles
│ │ ├── ShowedFileSuffixOnRename
│ │ ├── DisableNonRemovableDeviceUnmount
│ │ └── HiddenSystemPartition
│ └── BookMark
│ └── Items
└── appObtuselySetting
├── Cache
│ └── SearchHistroy
├── FileViewState
└── WindowManager
genericSetting
{
"GenericAttribute": {
// 开启快速文件搜索功能(1.8中实现)
"QuickSearch": false,
// 快速预览压缩包(像打开目录那样打开压缩包)
"PreviewCompressFile": false,
// 文本文件生成缩略图
"PreviewTextFile": true,
// 文档文件生成缩略图(pdf...)
"PreviewDocumentFile": true,
// 图片生成缩略图
"PreviewImage": true,
// 视频生成缩略图
"PreviewVideo": true,
// 自动挂载磁盘
"AutoMount": true,
// 插入U盘自动挂载且打开
"AutoMountAndOpen": false,
// 使用文件管理器提供的文件选择对话框
"OverrideFileChooserDialog": true,
// 在搜索结果中默认显示隐藏文件
"ShowedHiddenOnSearch": true,
// 显示隐藏文件
"ShowedHiddenFiles": false,
// 重命名文件时显示后缀名
"ShowedFileSuffixOnRename": true,
// 禁止卸载非可移动磁盘
"DisableNonRemovableDeviceUnmount": false,
// 隐藏系统分区
"HiddenSystemPartition": false
},
{
// 存储书签列表,每个书签有四个属性:
// created: 书签创建时间,ISO 8601格式
// lastModified: 最后修改时间,ISO 8601格式
// name: 书签名称
// url: 书签对应目录的url
"BookMark": {
"Items": [{
"created": "2018-06-01T11:41:32",
"lastModified": "2018-06-01T11:41:32",
"name": "主目录",
"url": "file:///home/deepin"
}]
}
}
}
appSetting
{
"ApplicationAttribute": {
// 总是在新窗口打开文件夹
"AllwayOpenOnNewWindow": false,
// 图标模式下的图标大小,取值范围:0-4
// 对应的图标大小为:[48 64 96 128 256]
"IconSizeLevel": 1,
// 默认视图模式,取值范围 [1 2],分别代表:图标模式和列表模式
"ViewMode": 1,
// 使用紧凑布局的列表模式(内容显示为两行,腾出更多空间显示文件名)
"ViewComppactMode": false,
// 根据窗口宽度自动切换列表模式为紧凑模式
"ViewAutoCompace": false,
// 使用鼠标打开文件或目录的动作,取值范围:[0 1]
// 分别表示:单机、双击
"OpenFileMode": 1,
// 打开新窗口时默认的url
// 可以使用文件管理器支持的所有url协议,如 file、bookmark、tag
// 另外针对一些特殊目录使用特殊的url表示
// standard://home,表示用户主目录
// standard://desktop,表示桌面目录
// standard://videos,表示视频目录
// standard://music,表示音乐目录
// standard://pictures,表示图片目录
// standard://documents,表示文档目录
// standard://downloads,表示下载目录
"UrlOfNewWindow": "computer:///",
// 打开新标签时默认的url,为空字符串时表示使用此窗口的当前路径
"UrlOfNewTab": "",
"ThemeName": "light"
}
}
genericObtuselySetting
{
"MenuActions": {
// 禁用的菜单项列表,加到此列表中的菜单项将不会显示在菜单中。可选值:
// Open 打开文件或目录
// OpenDisk 打开磁盘
// OpenInNewWindow 在新窗口中打开目录
// OpenInNewTab 在新标签中打开目录
// OpenDiskInNewWindow 在新窗口中打开磁盘
// OpenDiskInNewTab 在新标签中打开磁盘
// OpenAsAdmin 使用管理员模式打开目录
// OpenWith 使用指定程序打开文件
// OpenWithCustom 自定义程序打开文件(选择文件的默认打开方式)
// OpenFileLocation 打开文件所在位置(显示文件所在目录)
// Compress 压缩选中的文件
// Decompress 解压缩选中的文件
// DecompressHere 解压到当前目录
// Cut 剪切选中的文件
// Copy 复制选中的文件
// Paste 粘贴文件
// Rename 重命名文件
// BookmarkRename 重命名书签
// BookmarkRemove 删除书签
// CreateSymlink 创建软链接
// SendToDesktop 发送软链接到桌面
// SendToRemovableDisk 发送文件到磁盘
// AddToBookMark 添加书签
// Delete 将选中的文件移动到回收站
// Property 查看属性
// NewFolder 新建文件夹
// NewWindow 打开新窗口
// SelectAll 选中全部
// ClearTrash 清空回收站
// DisplayAs 选择视图模式
// SortBy 选择排序方式
// NewDocument 新建文档
// NewWord 新建word文件
// NewExcel 新建excel文件
// NewPowerpoint 新建powerpoint文件
// NewText 新建文本文件
// OpenInTerminal 在终端中打开此目录
// Restore 从回收站还原文件
// RestoreAll 还原回收站中的所有文件
// CompleteDeletion 彻底删除选中的文件
// Mount 挂载磁盘
// Unmount 下载磁盘
// Eject 弹出磁盘
// SafelyRemoveDrive 安全移除磁盘
// Name 文件名,用于选择排序方式的子菜单
// Size 文件大小,用于选择排序方式的子菜单
// Type 文件类型,用于选择排序方式的子菜单
// CreatedDate 文件创建时间,用于选择排序方式的子菜单
// LastModifiedDate 文件修改时间,用于选择排序方式的子菜单
// SourcePath 文件原始路径,用于选择排序方式的子菜单
// AbsolutePath 文件绝对路径,用于选择排序方式的子菜单
// Settings 程序设置入口
// Help 打开帮助对话框
// About 打开关于对话框
// Exit 退出应用程序
// IconView 图标模式,用于选择视图模式的子菜单
// ListView 列表模式,用于选择视图模式的子菜单
// SetAsWallpaper 将图片设置为壁纸
// Share 共享文件夹
// UnShare 取消文件夹共享
// FormatDevice 格式化磁盘
// TagInfo 显示文件Tag信息编辑框
// TagFilesUseColor 使用颜色快速标记文件
// ChangeTagColor 改变Tag的颜色
// DeleteTags 删除Tag
// RenameTag 重命名Tag
// ToggleTheme 切换窗口主题
"disable": ["Open", ..., ""]
},
// key为分区uuid,value为此分区在计算机页面显示时的备注名
"Disk/Volume": {
"34e594c1-341d-4961-9f85-822f366312da": "C"
},
// 在计算机页面的“内置磁盘”板块自定义增加虚拟磁盘
// key为显示的名称,value为对应的目录
"Disk/Custom": {
"C": "standard://home"
},
// 自定义隐藏文件的规则,符合此规则的文件会被判定为隐藏文件
// key为备注信息可以随意填写,value为正则表达式规则
"HiddenFiles": {
"隐藏临时文件": "^[~$].*"
},
// 符合下列规则的文件会被彻底隐藏,相当于此文件不存在
// key为备注信息可以随便填写,value为正则表达式规则
"PrivateFiles": {
"彻底隐藏临时文件": "^[~$].*"
}
}
appObtuselySetting
{
"Cache": {
// 搜索历史,此列表中的数据会出现在地址栏的输入补全列表
"SearchHistroy": ["aaa", "abc", "bookmark:///", "smb://10.0.12.150"]
},
// 控制特定目录的图标大小和视图模式
"FileViewState": {
"bookmark:///": {
"iconSizeLevel": 1,
// 默认视图模式,取值范围 [1 2],分别代表:图标模式和列表模式
"viewMode": 2,
// 排序方向,取值范围:正序=0,倒序=1
"sortOrder": 0,
// 以什么排序,取值范围:
// 文件路径(不包含文件名)=257
// 文件名=258
// 文件大小=259
// 文件类型=260
// 文件所有者=261
// 文件最后修改时间=262
// 文件最后读取时间=263
// 文件创建时间=264
// 文件显示名称=265
// 文件拼音名=266
// 文件基本名称(不包含后缀名)=268
// 文件后缀名=269
"sortRole": 262
},
"standard://desktop/aaa新建文件夹 1.1.": {
"iconSizeLevel": 1,
// 默认视图模式,取值范围 [1 2],分别代表:图标模式和列表模式
"viewMode": 2
}
},
"WindowManager": {
// 控制新窗口的宽和高
"WindowState": {
"height": 602,
"width": 800
}
}
}
后记
此架构只适用于对数据吞吐量、延迟、并发等性能都要求不高的环境。还有很大的改进空间。
【相关链接】