[英]Get a MIME Type from a extension in C++
给定文件扩展名,有什么方法可以获取C ++中的MIME类型?
我已经阅读了有关HKEY_CLASSES_ROOT的信息,但老实说,我不知道如何使用它。
我想要的是输入:
string extension=".pdf";
string extension2=".avi";
作为输出获取:
字符串mimeType =“ application / pdf”;
字符串mimeType2 =“ video / x-msvideo”;
我知道我可以自己做,但是我想这里已经完成了一些工作。
非常感谢
最简单的解决方案涉及调用FindMimeFromData
:
#include <urlmon.h>
#pragma comment( lib, "urlmon" )
std::wstring MimeTypeFromString( const std::wstring& str ) {
LPWSTR pwzMimeOut = NULL;
HRESULT hr = FindMimeFromData( NULL, str.c_str(), NULL, 0,
NULL, FMFD_URLASFILENAME, &pwzMimeOut, 0x0 );
if ( SUCCEEDED( hr ) ) {
std::wstring strResult( pwzMimeOut );
// Despite the documentation stating to call operator delete, the
// returned string must be cleaned up using CoTaskMemFree
CoTaskMemFree( pwzMimeOut );
return strResult;
}
return L"";
}
以下应用
int _tmain( int argc, _TCHAR* argv[] ) {
std::wcout << L".pdf: " << MimeTypeFromString( L".pdf" ) << std::endl;
std::wcout << L".avi: " << MimeTypeFromString( L".avi" ) << std::endl;
return 0;
}
在我的系统上产生以下输出:
.pdf: application/pdf
.avi: video/avi
快到圣诞节了,这怎么办:
#include <Windows.h>
#include <string>
using namespace std;
string GetMimeType(const string &szExtension)
{
// return mime type for extension
HKEY hKey = NULL;
string szResult = "application/unknown";
// open registry key
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szExtension.c_str(),
0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
// define buffer
char szBuffer[256] = {0};
DWORD dwBuffSize = sizeof(szBuffer);
// get content type
if (RegQueryValueEx(hKey, "Content Type", NULL, NULL,
(LPBYTE)szBuffer, &dwBuffSize) == ERROR_SUCCESS)
{
// success
szResult = szBuffer;
}
// close key
RegCloseKey(hKey);
}
// return result
return szResult;
}
int main(int argc, char* argv[])
{
string szExt1 = ".pdf";
string szExt2 = ".avi";
string szMime1 = GetMimeType(szExt1);
string szMime2 = GetMimeType(szExt2);
printf("%s = %s\n%s = %s\n", szExt1.c_str(), szMime1.c_str(),
szExt2.c_str(), szMime2.c_str());
return 0;
}
在我的系统上,它提供以下输出:
.pdf =应用/ pdf
.avi =视频/ avi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.