2012-03-07 149 views
3

我想在我的C#应用​​程序中获取文件类型的名称,即在Windows的文件属性中显示...例如.log文件的类型为LOG file (.log).batBatch file for Windows (.bat)(从我的lang翻译过来,所以可能不会准确)。如何获取文件类型名称?

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

+0

见链接http://stackoverflow.com/questions/770023/how-do-i-get-file-type-in​​formation-based-on-extention-not-mime-in-c-sharp - 你需要FriendlyDocName – 2012-03-07 12:14:00

+1

请理解,永远不会扩展将有这个信息。使用该应用程序的第一个应用程序必须在注册表中注册此信息。 – 2012-03-07 12:27:59

回答

0

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

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

+1这启发了我一个小的修改版本,谢谢:) – Zavael 2012-04-16 11:41:03

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

您必须调用相应的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("...")

0

你必须使用的SHGetFileInfo,见下面的链接,一些代码:

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

+1

这只显示如何检索图标,而不是文件类型名称。虽然额外的努力是微不足道的,但如果你真的显示要做什么,而不是仅仅发布链接,这将是有帮助的。 – 2012-03-07 12:03:51