Какой самый эффективный способ заполнить ComboBox всеми зарегистрированными типами файлов (не только расширениями) - PullRequest
1 голос
/ 31 января 2009

Что является наиболее эффективным для заполнения ComboBox всеми зарегистрированными типами файлов в Windows?

Мне нужен полный тип файла, а не только расширение. Я использую VB 9 (VS2008).

Ответы [ 4 ]

4 голосов
/ 31 января 2009

Все типы файлов хранятся в реестре в HKEY_CLASS_ROOT, который вы можете получить, используя класс реестра Framework .

.

Вот код 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;
    }
}
1 голос
/ 04 октября 2012
using Microsoft.Win32;
using System.Collections;
internal static class Extensions
{
    /// <summary>
    /// Gets a dictionary containing known file extensions and description from HKEY_CLASSES_ROOT.
    /// </summary>
    /// <returns>dictionary containing extensions and description.</returns>
    public static Dictionary<string, string> GetAllRegisteredFileExtensions()
    {
        //get into the HKEY_CLASSES_ROOT
        RegistryKey root = Registry.ClassesRoot;

        //generic list to hold all the subkey names
        Dictionary<string, string> subKeys = new Dictionary<string, string>();

        //IEnumerator for enumerating through the subkeys
        IEnumerator enums = root.GetSubKeyNames().GetEnumerator();

        //make sure we still have values
        while (enums.MoveNext())
        {
            //all registered extensions start with a period (.) so
            //we need to check for that
            if (enums.Current.ToString().StartsWith("."))
                //valid extension so add it and the default description if it exists
                subKeys.Add(enums.Current.ToString(), Registry.GetValue(root.Name + "\\" + enums.Current.ToString(), "", "").ToString());
        }
        return subKeys;
    }   
}
1 голос
/ 31 января 2009

Я согласен с Джоэлом, это будет много записей, и попытка найти что-то в списке сотен элементов списка будет очень плохим для пользователя. Кроме этого, единственный способ получить эту информацию - это пройти через реестр, как говорит Митч, но это не будет простой код.

Чего вы пытаетесь достичь?

Редактировать: @ Митч Уит, я знаю, что это было адресовано @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();
}
0 голосов
/ 31 января 2009

Я знаю, что это не отвечает на ваш вопрос, но стоит подумать: во многих системах это ЛОТ предметов. Возможно поиск или список вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...