windows客户端开发--获取windows系统中文件的MIME

首先,什么是MIME,是不是文件的后缀名呢?

当然不是。

有时候我们需要获取某个文件的后缀名,这也许对你来说太小case了,你可能不加思考的写了一个函数,更加文件名字符串查找最后一个’.’,然后取最有一个’.’之后的字符串,即为我们要得到的后缀名。

看似非常完美,但确实漏洞百出。

如果我的文件没有后缀名怎么办?

如果我的一张png图片,我强制把后缀名改为jpg怎么办?

这样你根据文件名字方法就不能获得百分百正确的后缀名。

所以,就该MIME出场了!

何为MIME?

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。

MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

接下来的工作就是在windows系统上,如何根据一个文件名路径,获取这个文件的mime呢?

起初,我觉得应该找一个第三方库来实现这个小小的功能,比如libmagic。

但是暮然回首,发现windows为我们提供了api。这里要插一句:windows确实是最复杂的操作系统。有时候我们再忽略了太多windows api给我们提供的函数。

FindMimeFromData

作用:

Determines the MIME type from the data provided.

原型:

HRESULT FindMimeFromData(
             LPBC    pBC,
             LPCWSTR pwzUrl,
             LPVOID  pBuffer,
             DWORD   cbSize,
             LPCWSTR pwzMimeProposed,
             DWORD   dwMimeFlags,
             LPWSTR  *ppwzMimeOut,
  _Reserved_ DWORD   dwReserved
);

参数:

pBC

A pointer to the IBindCtx interface. Can be set to NULL.

pwzUrl

A pointer to a string value that contains the URL of the data. Can be set to NULL if pBuffer contains the data to be sniffed.

pBuffer

A pointer to the buffer that contains the data to be sniffed. Can be set to NULL if pwzUrl contains a valid URL.

cbSize

An unsigned long integer value that contains the size of the buffer.

pwzMimeProposed

A pointer to a string value that contains the proposed MIME type. This value is authoritative if type cannot be determined from the data. If the proposed type contains a semi-colon (;) it is removed. This parameter can be set to NULL.

下面看看如何应用,首先是读一个文件,然后调用FindMimeFromData函数即可:

#include <urlmon.h>
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#pragma comment(lib, "Urlmon.lib")

int main(int argc, char* argv[])
{
    char buff[256];
    LPWSTR out;

    FILE *in = fopen("D:\\libsakura.lib", "rb");

    fread(buff, 1, 256, in);

    FindMimeFromData(NULL, NULL, buff, 256, NULL, FMFD_DEFAULT, &out, 0);

    printf("%ls\n", out);

    return 0;
}

下面是文件类型对应的MIME,仅供参考:

application/envoy   evy
application/fractals    fif
application/futuresplash    spl
application/hta hta
application/internet-property-stream    acx
application/mac-binhex40    hqx
application/msword  doc
application/msword  dot
application/octet-stream    *
application/octet-stream    bin
application/octet-stream    class
application/octet-stream    dms
application/octet-stream    exe
application/octet-stream    lha
application/octet-stream    lzh
application/oda oda
application/olescript   axs
application/pdf pdf
application/pics-rules  prf
application/pkcs10  p10
application/pkix-crl    crl
application/postscript  ai
application/postscript  eps
application/postscript  ps
application/rtf rtf
application/set-payment-initiation  setpay
application/set-registration-initiation setreg
application/vnd.ms-excel    xla
application/vnd.ms-excel    xlc
application/vnd.ms-excel    xlm
application/vnd.ms-excel    xls
application/vnd.ms-excel    xlt
application/vnd.ms-excel    xlw
application/vnd.ms-outlook  msg
application/vnd.ms-pkicertstore sst
application/vnd.ms-pkiseccat    cat
application/vnd.ms-pkistl   stl
application/vnd.ms-powerpoint   pot
application/vnd.ms-powerpoint   pps
application/vnd.ms-powerpoint   ppt
application/vnd.ms-project  mpp
application/vnd.ms-works    wcm
application/vnd.ms-works    wdb
application/vnd.ms-works    wks
application/vnd.ms-works    wps
application/winhlp  hlp
application/x-bcpio bcpio
application/x-cdf   cdf
application/x-compress  z
application/x-compressed    tgz
application/x-cpio  cpio
application/x-csh   csh
application/x-director  dcr
application/x-director  dir
application/x-director  dxr
application/x-dvi   dvi
application/x-gtar  gtar
application/x-gzip  gz
application/x-hdf   hdf
application/x-internet-signup   ins
application/x-internet-signup   isp
application/x-iphone    iii
application/x-javascript    js
application/x-latex latex
application/x-msaccess  mdb
application/x-mscardfile    crd
application/x-msclip    clp
application/x-msdownload    dll
application/x-msmediaview   m13
application/x-msmediaview   m14
application/x-msmediaview   mvb
application/x-msmetafile    wmf
application/x-msmoney   mny
application/x-mspublisher   pub
application/x-msschedule    scd
application/x-msterminal    trm
application/x-mswrite   wri
application/x-netcdf    cdf
application/x-netcdf    nc
application/x-perfmon   pma
application/x-perfmon   pmc
application/x-perfmon   pml
application/x-perfmon   pmr
application/x-perfmon   pmw
application/x-pkcs12    p12
application/x-pkcs12    pfx
application/x-pkcs7-certificates    p7b
application/x-pkcs7-certificates    spc
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-mime    p7c
application/x-pkcs7-mime    p7m
application/x-pkcs7-signature   p7s
application/x-sh    sh
application/x-shar  shar
application/x-shockwave-flash   swf
application/x-stuffit   sit
application/x-sv4cpio   sv4cpio
application/x-sv4crc    sv4crc
application/x-tar   tar
application/x-tcl   tcl
application/x-tex   tex
application/x-texinfo   texi
application/x-texinfo   texinfo
application/x-troff roff
application/x-troff t
application/x-troff tr
application/x-troff-man man
application/x-troff-me  me
application/x-troff-ms  ms
application/x-ustar ustar
application/x-wais-source   src
application/x-x509-ca-cert  cer
application/x-x509-ca-cert  crt
application/x-x509-ca-cert  der
application/ynd.ms-pkipko   pko
application/zip zip
audio/basic au
audio/basic snd
audio/mid   mid
audio/mid   rmi
audio/mpeg  mp3
audio/x-aiff    aif
audio/x-aiff    aifc
audio/x-aiff    aiff
audio/x-mpegurl m3u
audio/x-pn-realaudio    ra
audio/x-pn-realaudio    ram
audio/x-wav wav
image/bmp   bmp
image/cis-cod   cod
image/gif   gif
image/ief   ief
image/jpeg  jpe
image/jpeg  jpeg
image/jpeg  jpg
image/pipeg jfif
image/svg+xml   svg
image/tiff  tif
image/tiff  tiff
image/x-cmu-raster  ras
image/x-cmx cmx
image/x-icon    ico
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap    pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822  mht
message/rfc822  mhtml
message/rfc822  nws
text/css    css
text/h323   323
text/html   htm
text/html   html
text/html   stm
text/iuls   uls
text/plain  bas
text/plain  c
text/plain  h
text/plain  txt
text/richtext   rtx
text/scriptlet  sct
text/tab-separated-values   tsv
text/webviewhtml    htt
text/x-component    htc
text/x-setext   etx
text/x-vcard    vcf
video/mpeg  mp2
video/mpeg  mpa
video/mpeg  mpe
video/mpeg  mpeg
video/mpeg  mpg
video/mpeg  mpv2
video/quicktime mov
video/quicktime qt
video/x-la-asf  lsf
video/x-la-asf  lsx
video/x-ms-asf  asf
video/x-ms-asf  asr
video/x-ms-asf  asx
video/x-msvideo avi
video/x-sgi-movie   movie
x-world/x-vrml  flr
x-world/x-vrml  vrml
x-world/x-vrml  wrl
x-world/x-vrml  wrz
x-world/x-vrml  xaf
x-world/x-vrml  xof
时间: 2024-10-13 18:44:46

windows客户端开发--获取windows系统中文件的MIME的相关文章

Windows客户端开发简介(一)

在这样一个移动当道的年代,我跟大家讨论Windows客户端开发,似乎有些倚老卖老的意思了.然而我却觉得无论什么时候,Windows客户端开发其实还是有着不少实用经典的技术的.对了,确切说我是要说说Windows C++客户端开发,什么WinForm,WPF,并不在讨论范围之内,我承认用.NET ,C#做Windows客户端对开发人员来说确实是件轻松愉快的事,但是因为这些技术由于种种原因(主要还是效率问题)在经典的Windows客户端程序采用的少之又少,所以我打算把他们略过. 我并不是什么微软技术

windows客户端开发--使用tinyxml库解析xml文件

例如,微信windows客户端使用的duilib库中,界面就是用xml进行描述的. 所以,今天我们就来谈一谈windows客户端中,也就是C++中如何解析xml. 很多时候,我们都使用.ini文件来存储一些数据. xml确实是有很多的优点,某种程度上来说也确实可以完全取代ini,但也并非如有些人鼓吹的处处都比ini强. xml,对于描述复杂的数据结构非常的方便,缺点相对ini使用麻烦一点.在表达较短的配置时,没有ini简练.而且因为它有比较严格的格式审查机制,容错性也不是特别好,在手写时容易出现

windows客户端开发调试工具

本文介绍windows常用开发与调试工具. 1.windows常用开发与调试工具 1.1 Sysinternals 内核大神打造,含大量windows系统工具,windows开发必备神器,大神被MS招安. 下载地址:http://technet.microsoft.com/en-us/sysinternals Procmon.exe 监视程序运行过程中的动作,可用于性能监控. procexp.exe 相当于升级版的任务管理器,可以查看加载模块,模块查找,线程列表(含CPU百分比), 创建dump

Windows客户端C/C++编程规范“建议”——文件

7 文件 7.1 正确使用#include 等级:[推荐] 说明:#include <>和#include ""导致编译器在搜索文件时,搜索的路径顺序不同.所以需要正确使用#include,以避免包含错了头文件. 语法形式 操作 带引号的形式 预处理器按以下顺序搜索包含文件: 在包含 #include 语句的文件所在的同一目录中. 在当前打开的包含文件的目录中,采用与打开它们的顺序相反的顺序. 搜索从父包含文件的目录中开始进行,然后继续向上到任何祖父包含文件的目录. 跟随每

windows客户端开发--也许是一条不归路

如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄. 食之无味,弃之可惜. 不可否认,PC端没落的很快. 但是想说的是,任何一门技术都有存在的道理. 微软就是所有Windows客户端开发人员的大腿,虽然这个大腿让人捉摸不定,主方向总是变化. 换言之,Windows客户端开发难度不小.如果你能轻松的驾驭指针.内存.类等等,即使有一个Windows客户端彻底完蛋了,你也许只用一个星期或是一个月就掌握了另一种编程语言开发. 重要的是思想~ 我个人认为

Windows客户端迁移(windows轻松传送)

对于桌面支持来说,每次重装系统或是换机器时,数据备份是一个头痛的问题,尤其是邮件,不但有邮件还有一堆联系人,还有一堆规则,这是个让人很头痛的问题,前段时间,看了微软TechNet上面的一个关于windows 7部署的教程,知道了一个叫windows 轻松传送的工具,正好这两天单位换电脑,于是就试了一下,效果不错.电脑原先是windows XP的,所以要安装一个windows轻松传送,安装方法我就不说了,很简单的,软件下载地址:http://www.microsoft.com/zh-cn/down

在Linux系统中文件(资源)和用户的管理

一个可执行二进制程序,被加载到内存,被内核调度到CPU上运行,这时候,就表现了一个进程.也可以说进程是程序的一个实例,是程序的动态表现. 在 Linux 系统中进程(process)是有属主的,也就是该进程以哪个用户的身份运行的.大家都知道,程序有输入和输出,也称这为程序IO.如果我们程序数据输入是磁盘.如,Web 服务器,接收用户的请求之后,把网页数据从磁盘中读入加工之后再把数据响应给用户.如果,发起Web 服务进程的用户没有读取该用户请求网页文件的权限.则无法响应用户的请求了.所以,文件(资

linux系统中文件的特殊权限

在上篇博客中叙述linux系统中文件的基本属性,见http://vinsent.blog.51cto.com/13116656/1951574,这篇给大家带来linux系统文件的特殊权限,包括SUID.SGID.Sticky(粘滞位). 一.安全上下文 安全上下文指的是一类定义某个进程允许做什么的许可和权限的集合.安全上下文的概念范围很广范,权限.特权.访问令牌.完整性等级等等都包含在其中.这里只简要说说linux系统对文件的安全控制: (1)进程有属主和属组,文件有属主和属组      (2)

Linux系统中文件定位与查找

Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令--find和locate,以及压缩打包的命令--compress, gzip,bzip2,xz等.有问题或建议可发至邮箱[email protected] locate locate命令是通过查询Linux系统上预先构建的文件索引数据库,准确说来,这个数据库默认的位置是/var/lib/mlocate/mlocate.db,这个数据库一般由系统定时周期性更新,当然也可以通过update