2017-07-06 7 views
3

Delphi(XE7)で特定のMIMEタイプの標準拡張を取得する組み込みの方法はありますか?Delphiで標準のファイル拡張子をMIMEタイプで取得するにはどうすればよいですか?

私はこのように呼ばれることになる機能を実装するための最も簡単で一般的な方法を探しています:

fileExt := GetExtension('text/xml'); 
+0

私は知っているわけではありませんが、すばらしいgoogleがこれを見つけます:https://www.thoughtco.com/file-extensions-and-mime-types-3469109 –

+0

ありがとうございましたが、私はシステムを望んでいましたMIMEタイプのセットが時間とともに変化するため、たとえば、リンクしたテーブルでは、docx(application/vnd.openxmlformats-officedocument.wordprocessingml.document)のエントリはありません。 –

答えて

3

HKEY_CLASSES_ROOT \ MIME \データベース\コンテンツタイプの\ text/htmlで、値の拡張を。

+0

ありがとうございました! –

+0

確かに、これをカプセル化するAPIや標準的な方法があります。これは安定していると書かれていなければ、壊れやすいレジストリハッキングのように見えます。 –

+0

@DavidHeffernan Indyもこのレジストリキーを使用して、これが「公式」な方法だと考えることができます。 –

4

インディはTIdThreadSafeMimeTableに、そのための機能が組み込まれていそうです:

Uses 
    IdCustomHTTPServer; 


function GetMIMETypeDefaultExtension(const aMIMEType: String): String; 
var 
    mimetable: TIdThreadSafeMimeTable; 
Begin 
    if not(aMIMEType.Trim.IsEmpty) then 
    Begin 
    mimetable := TIdThreadSafeMimeTable.Create(true); 
    try 
     result := mimetable.GetDefaultFileExt(aMIMEType); 
    finally 
     mimetable.Free; 
    end 
    End 
    else 
     result := ''; 
End; 

編集:カスタムHTTPサーバなしで直接TIdThreadSafeMimeTableを使用するように固定機能。

uses 
    ..., IdGlobalProtocols; 

function GetExtension(const AMIMEType: string); 
begin 
    Result := GetMIMEDefaultFileExt(AMIMEType); 
end 

ちょうど内部で、GetMIMEDefaultFileExt()は、作成しTIdMimeTableオブジェクトを破壊することを知っていると、そのオブジェクトの再:

+1

* TIdThreadSafeMimeTable *を同じユニットで直接使用することもできます(サーバーを作成する必要はありません)。 – mjn42

+0

は、あなたが提案したようにanserがそのクラスを使用するように変更しました。 –

+1

'TIdThreadSafeMimeTable'はワーカースレッドが頻繁にキャッシュされたMIME情報へのアクセスを必要とするマルチスレッドサーバであるため、TIdHTTPServerとともに使用することを意図しています。 'IdGlobalProtocols'ユニットにスレッドセーフではない' TIdMimeTable'があります。これにはスタンドアロンの 'GetMIMETypeFromFile()'と 'GetMIMEDefaultFileExt()'関数(内部で 'TIdMimeTable'を使います)があります。上記の例では、呼び出されるたびにテーブルを作成および破棄しているため、 'TIdThreadSafeMimeTable'を使用することは過剰です。代わりに' TIdMimeTable'または 'GetMIMEDefaultFileExt()'を使用してください。 –

4

インディのIndyProtocolsパッケージはTIdMimeTableクラスとスタンドアロンGetMIMETypeFromFile()GetMIMEDefaultFileExt()ラッパー関数IdGlobalProtocols単位で、例えばを持っています作成されるたびに既知の拡張子とMIMEタイプのリストが作成されます。

uses 
    ..., IdGlobalProtocols; 

var 
    MimeTable: TIdMimeTable = nil; 

function GetExtension(const AMIMEType: string); 
begin 
    if MimeTable = nil then 
    MimeTable := TIdMimeTable.Create; 
    Result := MimeTable.GetDefaultFileExt(AMIMEType); 
end; 

initialization 
finalization 
    MimeTable.Free; 

:あなたが頻繁にMIME拡張を照会しようとしている場合は、そのたびに再利用(あなたが複数のスレッド間でテーブルを共有する必要がある場合や TIdThreadSafeMimeTable)、それはあなた自身の TIdMimeTableオブジェクトを作成する価値があるだろう
uses 
    ..., IdGlobalProtocols, IdCustomHTTPServer; 

var 
    MimeTable: TIdThreadSafeMimeTable = nil; 

function GetExtension(const AMIMEType: string); 
begin 
    if MimeTable = nil then 
    MimeTable := TIdThreadSafeMimeTable.Create; 
    Result := MimeTable.GetDefaultFileExt(AMIMEType); 
end; 

initialization 
finalization 
    MimeTable.Free; 
関連する問題