如何获取文件类型名称?

时间:2012-03-07 11:45:29

标签: c# file properties

我想在我的c#app中获取文件类型的名称,该名称显示在windows中的文件属性中...例如.log文件的类型为LOG file (.log)或{{1有} .bat(翻译自我的lang,所以可能不准确)。

请问,我在哪里可以找到这些信息?或者如何到达这个? 我找到了Get-Registered-File-Types-and-Their-Associated-Ico文章,其中autor显示了如何获取图标,但不显示操作系统中显示的文件的类型名称。

4 个答案:

答案 0 :(得分:4)

您必须调用相应的Shell函数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 :(得分:1)

您可以使用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);
}
}

答案 2 :(得分:1)

您可以从注册表中读取该信息

使用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 "";
}

答案 3 :(得分:0)

你必须使用shgetfileinfo,参见下面的链接了解一些代码:

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