无法获取某个文件的文件类型

时间:2013-09-02 04:14:46

标签: c# wpf file-type

因为我能够将图像的正确文件类型设置为JPEG图像。但我可以获取pdf文档或sql文件的文件类型。 我使用下面的代码:

public String Type
{
      get
      {
            return GetType(Path.GetExtension(_document.DocumentPath));
      }
 }
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 string GetType(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 "";
        }

正如我所见,在regedit中.pdf文件中没有“OpenWithProgids”子项。  那么可以做些什么来获取这些文件类型。

例如 在胜利7 enter image description here

文件类型列出了文件名和其他信息, 我想在我的应用程序中使用相同的文件类型 我能够使用xps文档而不能使用其他文档

2 个答案:

答案 0 :(得分:2)

您可以使用Windows API SHGetFileInfo函数

获取类型
        [Flags]
        private enum SHGFI : int
        {
            /// <summary>get type name</summary>
            TypeName = 0x000000400,
        }

        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi,
            uint cbFileInfo, uint uFlags);

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public 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;
        };

        private static void Main()
        {
            SHGFI flags = SHGFI.TypeName;
            SHFILEINFO shinfo = new SHFILEINFO();
           SHGetFileInfo(your path, 0,
                ref shinfo, (uint) Marshal.SizeOf(shinfo),(uint) flags);

            Console.WriteLine(shinfo.szTypeName);

            Console.ReadKey();
        }

答案 1 :(得分:0)

我在不同的链接中找到相同的代码, 我知道代码是相同的,但作为其他人给出的建议,但链接

Get file type in .NET

用bobbymcr回答帮帮我