手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

用C#获取文档类型信息

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardid=117&id=87653

[手动查看]
资源管理器 -> 工具 -> 文档夹选项 -> 文档类型

[C/C ]
#include <windows.h>
#include <shellapi.h> //SHFILEINFO结构和SHGetFileInfo函数所在
//#include <stdio.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("C:\\Windows\\notepad.exe", //文档路径
FILE_ATTRIBUTE_NORMAL, //文档属性
&shfi, //信息结构
sizeof(shfi),
SHGFI_TYPENAME); //获取标识

char *msg = shfi.szTypeName;

//在dos窗口输出
//printf("%s\n",msg);
//getchar();

LPCTSTR lpcstr = (LPCTSTR)msg; //char*转换LPCTSTR
MessageBox(NULL, lpcstr, "文档类型", MB_OK);
return 0;
}



[C#] - mode 1
using Microsoft.Win32;

//通过查询注册表来获取文档类型名称,但此方法具备致命缺陷!
string ext = ".mp3";
string desc = (string)Registry.ClassesRoot.OpenSubKey(ext).GetValue(null);
string typeinfo = (string)Registry.ClassesRoot.OpenSubKey(desc).GetValue(null);



[C#] - mode 2
using System.Runtime.InteropServices;

//在shell32.dll导入函数SHGetFileInfo
[DllImport("shell32.dll", EntryPoint="SHGetFileInfo")]
public static extern int GetFileInfo(string pszPath, int dwFileAttributes,
ref FileInfomation psfi, int cbFileInfo,int uFlags);

//定义SHFILEINFO结构(名字随便起,这里用FileInfomation)
[StructLayout(LayoutKind.Sequential)]
public struct FileInfomation
{
public IntPtr hIcon;
public int iIcon;
public int dwAttributes;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)]
public string szDisplayName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)]
public string szTypeName;
}

//定义文档属性标识
public enum FileAttributeFlags : int
{
FILE_ATTRIBUTE_READONLY =0x00000001,
FILE_ATTRIBUTE_HIDDEN =0x00000002,
FILE_ATTRIBUTE_SYSTEM =0x00000004,
FILE_ATTRIBUTE_DIRECTORY =0x00000010,
FILE_ATTRIBUTE_ARCHIVE =0x00000020,
FILE_ATTRIBUTE_DEVICE =0x00000040,
FILE_ATTRIBUTE_NORMAL =0x00000080,
FILE_ATTRIBUTE_TEMPORARY =0x00000100,
FILE_ATTRIBUTE_SPARSE_FILE =0x00000200,
FILE_ATTRIBUTE_REPARSE_POINT =0x00000400,
FILE_ATTRIBUTE_COMPRESSED =0x00000800,
FILE_ATTRIBUTE_OFFLINE =0x00001000,
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED =0x00002000,
FILE_ATTRIBUTE_ENCRYPTED =0x00004000
}

//定义获取资源标识
public enum GetFileInfoFlags : int
{
SHGFI_ICON =0x000000100, // get icon
SHGFI_DISPLAYNAME =0x000000200, // get display name
SHGFI_TYPENAME =0x000000400, // get type name
SHGFI_ATTRIBUTES =0x000000800, // get attributes
SHGFI_ICONLOCATION =0x000001000, // get icon location
SHGFI_EXETYPE =0x000002000, // return exe type
SHGFI_SYSICONINDEX =0x000004000, // get system icon index
SHGFI_LINKOVERLAY =0x000008000, // put a link overlay on icon
SHGFI_SELECTED =0x000010000, // show icon in selected state
SHGFI_ATTR_SPECIFIED =0x000020000, // get only specified attributes
SHGFI_LARGEICON =0x000000000, // get large icon
SHGFI_SMALLICON =0x000000001, // get small icon
SHGFI_OPENICON =0x000000002, // get open icon
SHGFI_SHELLICONSIZE =0x000000004, // get shell size icon
SHGFI_PIDL =0x000000008, // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES =0x000000010, // use passed dwFileAttribute
SHGFI_ADDOVERLAYS =0x000000020, // apply the appropriate overlays
SHGFI_OVERLAYINDEX =0x000000040 // Get the index of the overlay
}


private string GetTypeName(string fileName)
{
FileInfomation fileInfo = new FileInfomation(); //初始化FileInfomation结构

//调用GetFileInfo函数,最后一个参数说明获取的是文档类型(SHGFI_TYPENAME)
int res = GetFileInfo(fileName, (int)FileAttributeFlags.FILE_ATTRIBUTE_NORMAL,
ref fileInfo, Marshal.SizeOf(fileInfo), (int)GetFileInfoFlags.SHGFI_TYPENAME);

return fileInfo.szTypeName;
}

private void Form1_Load(object sender, System.EventArgs e)
{
string fileName = @"C:\Windows\notepad.exe"; //定义文档路径
string fileTypeName = GetTypeName(fileName);

MessageBox.Show(fileTypeName);
}



后记:搞了一个深夜,一头雾水~~~




[示例源代码]

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!