查看原文
其他

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

deepin研发中心 深度操作系统 2022-06-15


前言

文件管理器是一个复杂的项目,集成了很多的功能。功能多了,自然也就有了对功能定制的需求。在之前的版本中,主要是使用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

    }

}

}


后记

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



【相关链接】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存