2012-03-07 12 views
3

私はWindowsのファイルプロパティに表示されているファイルタイプの名前を私のC#アプリケーションに入れたいと思っています... .logファイルのタイプはLOG file (.log)または.batです(私のlangから翻訳されています正確)。ファイルタイプ名の取得方法は?

ここで、この情報はどこにありますか?またはこれに到達する方法? 私はGet-Registered-File-Types-and-Their-Associated-Icoという記事を見つけました。ここでautorはアイコンを取得する方法を示しますが、OSに表示されるファイルのタイプ名は表示しません。

+0

リンクhttp://stackoverflow.com/questions/770023/how-do-i-get-file-type-in​​formation-based-on-extention-not-mime-in-c-sharp-を参照してくださいFriendlyDocNameが必要です –

+1

拡張機能でこの情報が保持されることはありませんのでご了承ください。前記アプリケーションを使用する最初のアプリケーションは、この情報をレジストリに登録しなければならない。 –

答えて

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

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

あなたはネイティブのWin32 APIであるそれぞれのShell関数SHGetFileInfoを呼び出す必要があります。

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

これは、ファイルの種類名ではなくアイコンの取得方法のみを示しています。追加的な努力は軽微ですが、単にリンクを投稿するのではなく、実際に何をすべきかを示す場合に役立ちます。 –

関連する問題