Как получить имя типа файла? - PullRequest
4 голосов
/ 07 марта 2012

Я хочу получить в своем приложении c # имя типа файла, которое отображается в свойствах файла в Windows ... например, .log файл имеет тип LOG file (.log) или .bat имеет Batch file for Windows (.bat) (переведено с моего языка, так что, возможно, не точно).

Пожалуйста, где я могу найти эту информацию? или как к этому добраться? я нашел статью Get-Registered-File-Types-and-Их-Associated-Ico , где автор показывает, как получить значок, но не имя типа файла, который отображается в ОС.

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Вы должны вызвать соответствующую функцию оболочки SHGetFileInfo, которая является родным Win32 API.

class NativeMethods
{
    private const int FILE_ATTRIBUTE_NORMAL = 0x80;
    private const int SHGFI_TYPENAME = 0x400;

    [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr SHGetFileInfo(
        string pszPath,
        int dwFileAttributes,
        ref  SHFILEINFO shinfo,
        uint cbfileInfo,
        int uFlags);


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct SHFILEINFO
    {
        public SHFILEINFO(bool b)
        {
            hIcon = IntPtr.Zero;
            iIcon = 0;
            dwAttributes = 0;
            szDisplayName = "";
            szTypeName = "";
        }

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


    public static string GetShellFileType(string fileName)
    {
        var shinfo = new SHFILEINFO(true);
        const int flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES;

        if (SHGetFileInfo(fileName, FILE_ATTRIBUTE_NORMAL, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags) == IntPtr.Zero)
        {
            return "File";
        }

        return shinfo.szTypeName;
    }
}

Затем просто позвоните NativeMethods.GetShellFileType("...").

1 голос
/ 07 марта 2012

Вы можете прочитать эту информацию из реестра

используйте как GetDescription("cpp") или GetDescription(".xml")

public static string ReadDefaultValue(string regKey)
{
    using (var key = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(regKey, false))
    {
        if (key != null)
        {
            return key.GetValue("") as string;
        }
    }
    return null;
}

public static string GetDescription(string ext)
{
    if (ext.StartsWith(".") && ext.Length > 1) ext = ext.Substring(1);

    var retVal = ReadDefaultValue(ext + "file");
    if (!String.IsNullOrEmpty(retVal)) return retVal;


    using (var key = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("." + ext, false))
    {
        if (key == null) return "";

        using (var subkey = key.OpenSubKey("OpenWithProgids"))
        {
            if (subkey == null) return "";

            var names = subkey.GetValueNames();
            if (names == null || names.Length == 0) return "";

            foreach (var name in names)
            {
                retVal = ReadDefaultValue(name);
                if (!String.IsNullOrEmpty(retVal)) return retVal;
            }
        }
    }

    return "";
}
1 голос
/ 07 марта 2012

Вы можете получить эту информацию, используя SHGetFileInfo.

using System;
using System.Runtime.InteropServices;

namespace GetFileTypeAndDescription
{

class Class1
{
[STAThread]
static void Main(string[] args)
{
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr i = Win32.SHGetFileInfo(@"d:\temp\test.xls", 0, ref
shinfo,(uint)Marshal.SizeOf(shinfo),Win32.SHGFI_TY PENAME);
string s = Convert.ToString(shinfo.szTypeName.Trim());
Console.WriteLine(s);
}
}

[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};

class Win32
{
public const uint SHGFI_DISPLAYNAME = 0x00000200;
public const uint SHGFI_TYPENAME = 0x400;
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint
dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
}
}
0 голосов
/ 07 марта 2012

Вы должны использовать shgetfileinfo, см. Ссылку ниже для некоторого кода:

http://www.pinvoke.net/default.aspx/shell32.shgetfileinfo

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