2010-03-30 53 views
12

有沒有辦法在Windows上使用某些系統調用來獲取文件的MIME類型?我正在用C++編寫IIS擴展,所以它必須可以從C++調用,並且如果有某些功能暴露,我可以訪問IIS。顯然,IIS本身必須能夠做到這一點,但我的谷歌搜索一直無法找到如何。我在這裏找到了this.net相關的問題,但這並沒有給我太多希望(因爲在那裏沒有提到一個好的解決方案和C++解決方案)。在Windows上查找文件的MIME類型

我需要它,所以我可以使用適當的內容類型從我的應用程序提供動態文件。我的計劃是首先查閱我的應用程序中的MIME類型列表,然後回到系統的MIME類型列表(不過這很有效;顯然它存在,因爲它是將文件與程序關聯的方式)。在某些情況下,我只有一個文件擴展名,但在其他情況下,我可能有一個實際的磁盤文件需要檢查。由於這些不會是用戶上傳的文件,我相信我可以信任該擴展,並且我更願意使用僅擴展查找解決方案,因爲它看起來更簡單,速度更快。謝謝!

+0

你的假設是不正確的:在Windows上,擴展和項目之間的關聯不使用MIME類型。在註冊表中,每個擴展都與一個描述性條目相關聯,並且具有'\ Shell \ Open \ Command \'值。這種間接方式允許兩個擴展共享一個描述性條目,例如, '.jpeg'和'.jpg'共享描述性條目'jpegfile' – MSalters 2010-03-31 13:07:21

+0

MSalters,我可以發誓,在XP中,文件關聯對話框中有一個MIME類型的位置......但是在Win Server 2k8中,在「默認程序」對話框,它似乎就像你說...這對我沒有用:( – rmeador 2010-03-31 15:27:48

回答

13

HKCR\\.<ext>\Content Type(其中「ext」是文件擴展名)通常會保存MIME類型。

+0

不像Avitus解決方案,這支持.jpg和.jpeg – MSalters 2010-03-31 12:59:30

0

http://www.snoyman.com/blog/2012/03/ie-mimetype-png.html粘貼:

#include <urlmon.h> 
#include <stdio.h> 

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

    FILE *in = fopen("title.png", "rb"); 

    fread(buff, 1, 256, in); 

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

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

    return 0; 
}