文件管理器新配置文件格式详解

前言

文件管理器是一个复杂的项目,集成了很多的功能。功能多了,自然也就有了对功能定制的需求。在之前的版本中,主要是使用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为值的名称,一般使用小驼峰式命名法,不过,因为值可以在运行时由程序自由添加,且无法固定来源,所以对于此类值的名称没有约束。

存储位置

一个配置文件的结构分为三层:

名称 位置
默认配置 qrc:/config
系统级配置/通用配置 /etc/xdg/{Application}、/etc/xdg
用户级配置/通用配置 ~/.config/{Application}、~/.config

默认

用于定义配置项的默认值(初始化值),放在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
    }
}
}

后记

此架构只适用于对数据吞吐量、延迟、并发等性能都要求不高的环境。还有很大的改进空间。

发表评论

电子邮件地址不会被公开。 必填项已用*标注