您的位置:首页 > 编程语言 > C#

用C#获取文件类型信息

2012-12-20 11:21 363 查看

http://www.bugucn.com/2011/12/821.html

用C#获取文件类型信息

发布由 efour on 01 十二 2011 / 0 Comment

十二
1
2011


0

原帖及讨论:http://bbs.bccn.net/thread-87653-1-1.html



[手动查看]

资源管理器 -> 工具 -> 文件夹选项 -> 文件类型

[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 =0×00000001,

FILE_ATTRIBUTE_HIDDEN =0×00000002,

FILE_ATTRIBUTE_SYSTEM =0×00000004,

FILE_ATTRIBUTE_DIRECTORY =0×00000010,

FILE_ATTRIBUTE_ARCHIVE =0×00000020,

FILE_ATTRIBUTE_DEVICE =0×00000040,

FILE_ATTRIBUTE_NORMAL =0×00000080,

FILE_ATTRIBUTE_TEMPORARY =0×00000100,

FILE_ATTRIBUTE_SPARSE_FILE =0×00000200,

FILE_ATTRIBUTE_REPARSE_POINT =0×00000400,

FILE_ATTRIBUTE_COMPRESSED =0×00000800,

FILE_ATTRIBUTE_OFFLINE =0×00001000,

FILE_ATTRIBUTE_NOT_CONTENT_INDEXED =0×00002000,

FILE_ATTRIBUTE_ENCRYPTED =0×00004000

}

//定义获取资源标识

public enum GetFileInfoFlags : int

{

SHGFI_ICON =0×000000100, // get icon

SHGFI_DISPLAYNAME =0×000000200, // get display name

SHGFI_TYPENAME =0×000000400, // get type name

SHGFI_ATTRIBUTES =0×000000800, // get attributes

SHGFI_ICONLOCATION =0×000001000, // get icon location

SHGFI_EXETYPE =0×000002000, // return exe type

SHGFI_SYSICONINDEX =0×000004000, // get system icon index

SHGFI_LINKOVERLAY =0×000008000, // put a link overlay on icon

SHGFI_SELECTED =0×000010000, // show icon in selected state

SHGFI_ATTR_SPECIFIED =0×000020000, // get only specified attributes

SHGFI_LARGEICON =0×000000000, // get large icon

SHGFI_SMALLICON =0×000000001, // get small icon

SHGFI_OPENICON =0×000000002, // get open icon

SHGFI_SHELLICONSIZE =0×000000004, // get shell size icon

SHGFI_PIDL =0×000000008, // pszPath is a pidl

SHGFI_USEFILEATTRIBUTES =0×000000010, // use passed dwFileAttribute

SHGFI_ADDOVERLAYS =0×000000020, // apply the appropriate overlays

SHGFI_OVERLAYINDEX =0×000000040 // 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);

}

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

[示例源代码]

点击下载该文件

此主题相关图片如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: