C# 用所有注册的文件类型(不仅仅是扩展名)填充组合框最有效的方法是什么
在Windows中,用所有注册的文件类型填充组合框最有效的方法是什么C# 用所有注册的文件类型(不仅仅是扩展名)填充组合框最有效的方法是什么,c#,file,combobox,registry,C#,File,Combobox,Registry,在Windows中,用所有注册的文件类型填充组合框最有效的方法是什么 我想要完整的文件类型,而不仅仅是扩展名。我使用的是VB 9 VS2008。我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。也许是搜索或列表框?我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。可能是搜索或列表框?所有文件类型都存储在注册表的HKEY_CLASS_根目录下,您可以使用框架的 下面是执行此任务的c代码: using Microsoft.Win32; public class File
我想要完整的文件类型,而不仅仅是扩展名。我使用的是VB 9 VS2008。我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。也许是搜索或列表框?我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。可能是搜索或列表框?所有文件类型都存储在注册表的HKEY_CLASS_根目录下,您可以使用框架的 下面是执行此任务的c代码:
using Microsoft.Win32;
public class FileAssoc
{
public string Extension;
public string Filetype;
public FileAssoc(string fileext, string name)
{
Extension = fileext;
Filetype = name;
}
}
public static class EnumRegFiles
{
public static List<FileAssoc> GetFileAssociations()
{
List<FileAssoc> result = new List<FileAssoc>();
RegistryKey rk = Registry.ClassesRoot;
String[] names = rk.GetSubKeyNames();
foreach (string file in names)
{
if (file.StartsWith("."))
{
RegistryKey rkey = rk.OpenSubKey(file);
object descKey = rkey.GetValue("");
if (descKey != null)
{
string desc = descKey.ToString();
if (!string.IsNullOrEmpty(desc))
{
result.Add(new FileAssoc(file, desc));
}
}
}
}
return result;
}
}
所有文件类型都存储在注册表中的HKEY_CLASS_根目录下,您可以使用框架的 下面是执行此任务的c代码:
using Microsoft.Win32;
public class FileAssoc
{
public string Extension;
public string Filetype;
public FileAssoc(string fileext, string name)
{
Extension = fileext;
Filetype = name;
}
}
public static class EnumRegFiles
{
public static List<FileAssoc> GetFileAssociations()
{
List<FileAssoc> result = new List<FileAssoc>();
RegistryKey rk = Registry.ClassesRoot;
String[] names = rk.GetSubKeyNames();
foreach (string file in names)
{
if (file.StartsWith("."))
{
RegistryKey rkey = rk.OpenSubKey(file);
object descKey = rkey.GetValue("");
if (descKey != null)
{
string desc = descKey.ToString();
if (!string.IsNullOrEmpty(desc))
{
result.Add(new FileAssoc(file, desc));
}
}
}
}
return result;
}
}
我同意Joel的观点,那将会有很多条目,试图在一个包含数百个条目的组合框列表中找到一些东西,最终会成为一个非常糟糕的用户体验。除此之外,获得这些信息的唯一方法是通过注册表,正如Mitch所说,但这不是简单的代码 你想完成什么 编辑:@Mitch Wheat,我知道这封信是写给@Mark Brackett的,但我无法抗拒挑战。使用LINQ,您的代码可以编写为:
public static IList GetFileAssociations()
{
return Registry.ClassesRoot.GetSubKeyNames().Where(key => key.StartsWith(".")).Select(key =>
{
string description = Registry.ClassesRoot.OpenSubKey(key).GetValue("") as string;
if (!String.IsNullOrEmpty(description))
{
return new { key, description };
}
else
{
return null;
}
}).Where(a => a != null).ToList();
}
我同意Joel的观点,那将会有很多条目,试图在一个包含数百个条目的组合框列表中找到一些东西,最终会成为一个非常糟糕的用户体验。除此之外,获得这些信息的唯一方法是通过注册表,正如Mitch所说,但这不是简单的代码 你想完成什么 编辑:@Mitch Wheat,我知道这封信是写给@Mark Brackett的,但我无法抗拒挑战。使用LINQ,您的代码可以编写为:
public static IList GetFileAssociations()
{
return Registry.ClassesRoot.GetSubKeyNames().Where(key => key.StartsWith(".")).Select(key =>
{
string description = Registry.ClassesRoot.OpenSubKey(key).GetValue("") as string;
if (!String.IsNullOrEmpty(description))
{
return new { key, description };
}
else
{
return null;
}
}).Where(a => a != null).ToList();
}
代码很简单,现在已经发布了-看起来大约有20行,可以至少减少50%左右,你没有回答这个问题,你的帖子基本上也是我写的!。也就是说,我没有投反对票,只是提出批评@马克·布莱克特:如果你认为你可以把我发布的代码削减50%,我建议你发布一个答案,说明如何做到这一点@米奇·麦特:我知道这封信是写给@Mark Brackett的,但我无法抗拒这个挑战。有关LINQ版本,请参见“我的答案”的编辑。@Scott Dorman:好的,它较短,但更容易理解吗?@Mitch Wheat:这不是原始要求的一部分:如果你熟悉/熟悉LINQ,我会说它和你的代码一样容易理解。代码很简单,现在已经发布了-看起来大约有20行,可以减少至少50%左右,你没有回答这个问题,你的帖子基本上也是我写的!。也就是说,我没有投反对票,只是提出批评@马克·布莱克特:如果你认为你可以把我发布的代码削减50%,我建议你发布一个答案,说明如何做到这一点@米奇·麦特:我知道这封信是写给@Mark Brackett的,但我无法抗拒这个挑战。有关LINQ版本,请参见“我的答案”的编辑。@Scott Dorman:好的,它较短,但更容易理解吗?@Mitch Wheat:这不是原始要求的一部分:如果您熟悉/熟悉LINQ,我认为它和您的代码一样容易理解。