Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用所有注册的文件类型(不仅仅是扩展名)填充组合框最有效的方法是什么_C#_File_Combobox_Registry - Fatal编程技术网

C# 用所有注册的文件类型(不仅仅是扩展名)填充组合框最有效的方法是什么

C# 用所有注册的文件类型(不仅仅是扩展名)填充组合框最有效的方法是什么,c#,file,combobox,registry,C#,File,Combobox,Registry,在Windows中,用所有注册的文件类型填充组合框最有效的方法是什么 我想要完整的文件类型,而不仅仅是扩展名。我使用的是VB 9 VS2008。我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。也许是搜索或列表框?我知道这不能回答您的问题,但值得考虑:在许多系统上,这是很多项。可能是搜索或列表框?所有文件类型都存储在注册表的HKEY_CLASS_根目录下,您可以使用框架的 下面是执行此任务的c代码: using Microsoft.Win32; public class File

在Windows中,用所有注册的文件类型填充组合框最有效的方法是什么


我想要完整的文件类型,而不仅仅是扩展名。我使用的是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,我认为它和您的代码一样容易理解。