Feedback

C# - Beschreibung einer Dateierweiterung ermitteln

Veröffentlicht von am 2/17/2014
(0 Bewertungen)
Der Windows Explorer kann für verschiedene Dateitypen Beschreibungen anzeigen. U.a. in der Statuszeile (Win7) oder im Eigenschaftenfenster einer Datei.
Dieses Snippet stellt 2 Methoden bereit, mit denen die Beschreibung ermittelt werden kann. Die erste liest die registrierte Beschreibung aus. Diese ist aber nicht immer übersetzt. Selbst Windowseigene Dateierweiterungen sind manchmal auf Englisch. (Beispielsweise Anwendungen (EXE-Datei))
Die 2. Methode benutzt die Windows API. Dabei wird auch eine Beschreibung für nicht registrierte Typen ermittelt. (XYZ-Datei)

Benötigte Namespaces
System
System.Runtime.InteropServices
Microsoft.Win32

Funktionsweise
Über die Registry: Im HKEY_CLASSES_ROOT-Knoten befindet sich eine Liste sämtlicher registrierter Dateierweiterungen. Der Standardwert von jedem Schlüssel enthält einen ausführlicheren Dateitypnamen. Dieser ist ein weiterer Schlüssel, welcher als Standardwert die Beschreibung enthält.
Über die WinAPI: Es wird ein Informationsobjekt für eine Datei abgerufen. Über dieses können die Dateiattribute, das Symbol sowie die Beschreibung ausgelesen werden. Hier wird aber nur die Beschreibung weiter verarbeitet.

Testanwendung
Konsolenprojekt (C#), .NET 4.5
Console.WriteLine("TYP   " + "Explorer".PadRight(36, ' ') + " Registriert");
Console.WriteLine("XLS " + GetFileExtensionExplorerDescription(".xls").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription("xls"));
Console.WriteLine("XLSX " + GetFileExtensionExplorerDescription(".xlsx").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription("xlsx"));
Console.WriteLine("DOC " + GetFileExtensionExplorerDescription(".doc").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription("doc"));
Console.WriteLine("PDF " + GetFileExtensionExplorerDescription(".pdf").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription("pdf"));
Console.WriteLine("EXE " + GetFileExtensionExplorerDescription(".exe").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription("exe"));
Console.WriteLine(" " + GetFileExtensionExplorerDescription("").PadRight(36, ' ') + " " + GetFileExtensionRegistredDescription(""));//Datei ohne Endung

Console.ReadKey();


Getestete Plattformen
Windows 8.1 x64 mit .NET 4.5
/// <summary>
/// Ermittelt die registrierte Beschreibung einer Dateierweiterung.
/// </summary>
/// <param name="fileExt">Die Dateierweiterung ohne Punkt. Wird <c>null</c> oder eine leere Zeichenfolge angegeben, so wird string.Empty zurück gegeben.</param>
/// <returns>Die Beschreibung der Dateierweiterung <paramref name="fileExt"/>.</returns>
/// <exception cref="System.NullReferenceException">Wird ausgelöst, wenn eine Dateierweiterung nicht gefunden wurde.</exception>
static string GetFileExtensionRegistredDescription(string fileExt)
{
    try
    {
        if (string.IsNullOrEmpty(fileExt))
            return string.Empty;//Keine Beschreibung, weil keine Endung

        string fileTypeName = Registry.ClassesRoot.OpenSubKey("." + fileExt).GetValue("", "").ToString();//Den Namen der Dateierweiterung herausfinden
        return Registry.ClassesRoot.OpenSubKey(fileTypeName).GetValue("", "").ToString();//Im Namen steht die Beschreibung
    }
    catch (NullReferenceException ex)
    {
        throw new ArgumentNullException("Extension not exists", ex);
    }
}

/// <summary>
/// Ermittelt die Beschreibung einer Dateierweiterung.
/// </summary>
/// <param name="fileExt">Die Dateierweiterung mit Punkt oder der Dateiname.</param>
/// <returns>Die Beschreibung der Dateierweiterung <paramref name="fileExt"/>. Für Dateien ohne Endung kein keine Beschreibung ermittelt werden.<para/>
/// Sollte ein Fehler auftreten, wird eine leere Zeichenfolge zurück gegeben.</returns>
static string GetFileExtensionExplorerDescription(string fileExt)
{
    try
    {
        SHFILEINFO info = new SHFILEINFO();
        SHGetFileInfo(fileExt, 0x80, ref info, (uint)Marshal.SizeOf(info), 0x400 | 0x10);
        return info.szTypeName;
    }
    catch
    {
        return string.Empty;
    }
}
/// <summary>
/// Ruft ein Informationsobjekt für eine Datei ab.
/// </summary>
[DllImport("shell32.dll")]
internal static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[StructLayout(LayoutKind.Sequential)]
internal struct SHFILEINFO
{
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
};

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!