C#中文件夹元数据的编辑器

目录

介绍

背景

使用代码

配置

参数解析

注册

本地化

对话框

翻译对话框

帮助

控制

扩展

定义

用法

通用

阅读和写作Desktop.ini


介绍

当我想管理一堆文件夹而不将它们组织在子目录中时,就需要文件夹元数据编辑器。在网上搜索时,我发现desktop.ini(以及Windows资源管理器)支持我正在寻找的内容——只是Microsoft没有为它提供用户界面。这就是文件夹元数据编辑器的用武之地。它提供了一种编辑这些元数据的简单方法。

背景

如果文件夹包含以下内容,Desktop.ini支持文件夹的元数据:

[{F29F85E0-4FF9-1068-AB91-08002B27B3D9}]
Prop2=31,Title
Prop3=31,Subject
Prop4=31,Author
Prop5=31,Tag
Prop6=31,Comment

对于读取和写入,使用API函数GetPrivateProfileStringWritePrivateProfileString

文件夹元数据编辑器还支持简单的参数解析和本地化。

使用代码

代码分为以下子名称空间:

  • 配置
    • 参数解析
    • 地方化
    • 注册
  • 对话 框
    • 对话框表单
    • 扩展ListBox控制
    • 表单帮助程序类和从资源中提取图标
  • 扩展
    • stringStringCollection类的扩展
  • 通用
    • desktop.ini的加载/写入
    • 泛型帮助程序类

配置

参数解析

参数分析由使用该ParameterNames类的ArgParser类完成。

ParameterNames.cs文件包含ParameterNames类和ParamConstants枚举。

ParameterNames类的ParseParamConstants函数将命令行参数(如/dir)转换为正确ParamConstants的值ParamConstants.Dir

实际的参数解析是在ArgParser类中完成的。由于这是一个Windows.Forms应用程序,因此我们在main函数中没有string[] args参数。因此,该ArgParser类具有一个无参数构造函数,并通过using System.Environment.GetCommandLineArgs()检索命令行参数。

注册

由于该应用程序应该与文件夹一起使用,因此我们需要在Windows注册表的HKEY_CLASSES_ROOT\Folder\shell 下注册它。为此,我们创建了一个新的注册表项FolderMetaData。此键的默认值表示快捷菜单中的文本(在Windows资源管理器中右键单击文件夹时)。在此注册表项下,我们创建另一个注册表项command。然后,该command键的默认值包含应用程序的完整路径以及文件夹的路径,例如 C:\Program Files\FolderMetadata\FolderMetadata.exe/dir “%1

为了允许在右键单击文件夹的背景时使用该应用程序,我们在HKEY_CLASSES_ROOT\Directory\Background\shell下创建另一个注册表项。该过程与之前相同。这里唯一的区别是,我们不使用%1作为参数,而是%V

注销时,通过检查command注册表项的默认值来标识注册表项。这允许删除注册表项,即使注册表项是使用其他语言创建的。

注册和取消注册由Registrator类完成。您需要管理权限才能使这些操作成功。

在命令行上,使用以下命令注册或注销:

  • FolderMetadata.exe/注册
  • FolderMetadata.exe/取消注册

本地化

本地化由LanguageConfigurator类处理。在大多数情况下,它只会使用运行环境的语言。但是,您也可以通过指定/lang命令行参数(例如,/lang ja对于日语)或通过指定命令行参数/lang select来选择语言来更改语言。为了允许语言选择对话框显示所有受支持语言的列表,SupportedLanguages类的GetSupportedLanguages函数必须包含它。

如果您处理字母语言,Windows.Forms应用程序的本地化非常简单。在处理非字母语言(例如中文和日语)时,这会带来更多的挑战。

  1. 助记符支持(例如&Save,按钮的键盘快捷键)将不存在
  2. 处理简体中文本地化和繁体中文本地化

由于我想保持本地化过程的简单性,因此我将大部分工作留给了.NET Framework。因此,我将FolderMetadata项目的Neutral language属性设置为English (United States)。并创建了一个单独的资源文件Strings.resx。此文件包含所有翻译+ForceMnemonics,该值表示一个bool值,并且必须truefalse。分析的结果可在LanguageConfigurator类的ForceShowMnemonics属性中访问。

对于中文本地化,我创建了两个资源文件:

  • Strings.zh.resx
  • S trings.zh-TW.resx

这意味着,除了具有台湾Windows设置的用户之外,所有用户都将看到简体中文字符。但是,这不适用于来自香港和澳门的用户。因此,我添加了检查语言设置是否需要繁体中文显示的GetLanguageZH函数。如果是这样,它会将语言设置更改为zh-TW。现在,用户还可以看到繁体汉字。

对话框

翻译对话框

当具有复杂的表单时,设置表单的LocalizableLanguage属性可能是一种很好的方法。例如,这允许重新排列每种语言的控件。但是,如果您有多种语言,这会使编辑对话框变得更加困难。这就是为什么我决定不采用这种方法,而是使用一种更实际的方法:TableLayoutPanel使用和支持ButtonAdjustor类使按钮具有相同的宽度。

每个表单都有一个WndProc覆盖。在这个重写的函数中,我们检查LanguageConfigurator类的ForceShowMnemonics属性是否为true。如果是,它将调用WndProcOverrides类的ShowMnemonics方法,以确保助记符可见。

帮助

FrmHelp表单包含HTML格式的帮助。它还被翻译成各种语言,并在用户执行以下操作之一时打开:

  • 在不指定任何支持的参数的情况下启动应用程序(例如,在Windows资源管理器中双击)
  • 指定/?命令行参数

控制

ListBoxEx control继承自Windows.FormsListBox。它提供了一些用于加载值(用于FrmMain窗体)和移动所选项目(用于FrmManage窗体)的功能。

扩展

如果你以前没有使用过扩展,你就错过了一个非常有用的.NET功能。扩展允许您将自己的函数添加到类中。只有一个缺点:您只能添加实例函数,而不能添加static函数,如string.IsNullOrEmpty

定义

public static class String
{
    public static bool IsEmpty(this string s)
    {
        return (s.Length == 0);
    }
}

用法

using HKS.FolderMetadata.Extensions; //Add this on top of your class file,
                                     //preceding the name space definition.

//In your method, use something like this:

string s = "Hello";

if (s.IsEmpty())
{
  //Do something
}

通用

阅读和写作Desktop.ini

读写desktop.ini的功能在Metadata类中。由于该程序适用于Windows平台,因此我们可以使用API函数GetPrivateProfileStringWritePrivateProfileString及读取和写入。

desktop.ini中,所有元数据属性都是单行文本。由于作者可能不止一个人(例如,披头士乐队的歌曲总是由约翰·列侬和保罗·麦卡特尼创作),或者您想设置多个标签,我们必须将一行转换为列表,反之亦然。

Metadata类的构造函数需要要编辑元数据的目录的完整路径。然后,它将组装到desktop.ini的完整路径。该类具有由Load方法填充并由Save方法写入文件的属性。

https://www.codeproject.com/Articles/5291165/Editor-for-Folder-Metadata-in-Csharp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值