2009-01-31 4 views
1

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

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

спасибо.

ответ

4

Все типы файлов хранятся в реестре под HKEY_CLASS_ROOT, который вы можете получить, используя Registry class 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; 
    } 
} 
0

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

1

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

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

Редактировать: @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(); 
} 
+0

И это downvoted почему? –

+0

Код прост (и был опубликован сейчас - выглядит примерно 20 строк, и его можно сократить не менее чем на 50% или около того), вы не ответили на вопрос, и ваш пост по существу сводится к «мне , слишком!". Тем не менее, я не уменьшил его, просто предлагая критические замечания. ;) –

+0

@Mark Brackett: если вы думаете, что можете сократить этот код, который я опубликовал на 50%, я предлагаю вам опубликовать ответ, показывающий, как это сделать! –

1
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; 
    } 
}