目录
介绍
当我想管理一堆文件夹而不将它们组织在子目录中时,就需要文件夹元数据编辑器。在网上搜索时,我发现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函数GetPrivateProfileString和WritePrivateProfileString。
文件夹元数据编辑器还支持简单的参数解析和本地化。
使用代码
代码分为以下子名称空间:
- 配置
- 参数解析
- 地方化
- 注册
- 对话 框
- 对话框表单
- 扩展ListBox控制
- 表单帮助程序类和从资源中提取图标
- 扩展
- string和StringCollection类的扩展
- 通用
- 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应用程序的本地化非常简单。在处理非字母语言(例如中文和日语)时,这会带来更多的挑战。
- 助记符支持(例如&Save,按钮的键盘快捷键)将不存在
- 处理简体中文本地化和繁体中文本地化
由于我想保持本地化过程的简单性,因此我将大部分工作留给了.NET Framework。因此,我将FolderMetadata项目的Neutral language属性设置为“English (United States)”。并创建了一个单独的资源文件Strings.resx。此文件包含所有翻译+值ForceMnemonics,该值表示一个bool值,并且必须是true或false。分析的结果可在LanguageConfigurator类的ForceShowMnemonics属性中访问。
对于中文本地化,我创建了两个资源文件:
- Strings.zh.resx
- S trings.zh-TW.resx
这意味着,除了具有台湾Windows设置的用户之外,所有用户都将看到简体中文字符。但是,这不适用于来自香港和澳门的用户。因此,我添加了检查语言设置是否需要繁体中文显示的GetLanguageZH函数。如果是这样,它会将语言设置更改为zh-TW。现在,用户还可以看到繁体汉字。
对话框
翻译对话框
当具有复杂的表单时,设置表单的Localizable和Language属性可能是一种很好的方法。例如,这允许重新排列每种语言的控件。但是,如果您有多种语言,这会使编辑对话框变得更加困难。这就是为什么我决定不采用这种方法,而是使用一种更实际的方法:TableLayoutPanel使用和支持ButtonAdjustor类使按钮具有相同的宽度。
每个表单都有一个WndProc覆盖。在这个重写的函数中,我们检查LanguageConfigurator类的ForceShowMnemonics属性是否为true。如果是,它将调用WndProcOverrides类的ShowMnemonics方法,以确保助记符可见。
帮助
该FrmHelp表单包含HTML格式的帮助。它还被翻译成各种语言,并在用户执行以下操作之一时打开:
- 在不指定任何支持的参数的情况下启动应用程序(例如,在Windows资源管理器中双击)
- 指定/?命令行参数
控制
ListBoxEx control继承自Windows.Forms的ListBox。它提供了一些用于加载值(用于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函数GetPrivateProfileString和WritePrivateProfileString及读取和写入。
在desktop.ini中,所有元数据属性都是单行文本。由于作者可能不止一个人(例如,披头士乐队的歌曲总是由约翰·列侬和保罗·麦卡特尼创作),或者您想设置多个标签,我们必须将一行转换为列表,反之亦然。
Metadata类的构造函数需要要编辑元数据的目录的完整路径。然后,它将组装到desktop.ini的完整路径。该类具有由Load方法填充并由Save方法写入文件的属性。
https://www.codeproject.com/Articles/5291165/Editor-for-Folder-Metadata-in-Csharp