17


6

エクスプローラのように拡張子に基づいて一般的なファイルタイプの説明を取得するにはどうすればよいですか。 MIMEではなく、エンドユーザーに表示される情報などです。

doc = Microsoft Office Word 97 - 2003 Document .zip = ZIP File .avi =

ビデオファイル

そして、どのように私はそれが拡張子ベースではないと思います利用可能であるように思われる「二次」情報を手に入れることができます。 「ビデオファイル」のようにそれはあなたにそれがあなたにそれがあなたに映画の「長さ」を与えることができるか、またはdocファイルの上にそれが何ページあるか.. etc etc ..

4 Answer


26


ありがとう、ダン、よろしく。 これは私が持っていた最初の質問に答えます。 悲しいことに二番目ではありません。 注:すべてが印刷されるわけではありません。 PInvoke.netへのクレジット

システムを使用する。 System.Runtime.InteropServicesを使用します。 System.Textを使用します。 System.Diagnosticsを使用します。

名前空間WindowsFormsApplication1 {静的クラスプログラム{[DllImport( "Shlwapi.dll"、SetLastError = true、CharSet = CharSet.Auto)]静的外部リンクAssocQueryString(AssocFフラグ、AssocStr文字列、文字列pszAssoc、文字列pszExtra、[Out] StringBuilder pszOut、 [内] [外]参照先pcchOut);

/// ///アプリケーションのメインエントリポイント。 /// [STAThread] static void Main(){Debug.WriteLine(FileExtentionInfo(AssocStr.Command、 ".doc")、 "Command"); Debug.WriteLine(FileExtentionInfo(AssocStr.DDEApplication、 ".doc")、 "DDEApplication"); Debug.WriteLine(FileExtentionInfo(AssocStr.DDEIfExec、 ".doc")、 "DDEIfExec"); Debug.WriteLine(FileExtentionInfo(AssocStr.DDETopic、 ".doc")、 "DDETopic"); Debug.WriteLine(FileExtentionInfo(AssocStr.Executable、 ".doc")、 "Executable"); Debug.WriteLine(FileExtentionInfo(AssocStr.FriendlyAppName、 ".doc")、 "FriendlyAppName"); Debug.WriteLine(FileExtentionInfo(AssocStr.FriendlyDocName、 ".doc")、 "FriendlyDocName"); Debug.WriteLine(FileExtentionInfo(AssocStr.NoOpen、 ".doc")、 "NoOpen"); Debug.WriteLine(FileExtentionInfo(AssocStr.ShellNewValue、 ".doc")、 "ShellNewValue");

// DDEAアプリケーション:WinWord // DDEIfExec:?// // DDETopic:システム//実行可能ファイル:C:\ Program Files(x86)\ Microsoft Office \ Office12 \ WINWORD.EXE // FriendlyAppName:Microsoft Office Word // FriendlyDocName:Microsoft Office Word 97  -  2003年のドキュメント

}

パブリック静的文字列FileExtentionInfo(AssocStr assocStr、文字列doctype){uint pcchOut = 0; AssocQueryString(AssocF.Verify、assocStr、doctype、null、null、参照pcchOut);

StringBuilder pszOut = new StringBuilder((int)pcchOut); AssocQueryString(AssocF.Verify、assocStr、doctype、null、pszOut、ref pcchOut); pszOut.ToString()を返します。 }

【フラグ】パブリック列挙AssocF {Init_NoRemapCLSID = 0x1の、Init_ByExeName = 0x2の、Open_ByExeName = 0x2の、Init_DefaultToStar = 0x4の、Init_DefaultToFolder = 0x8という、NoUserSettings = 0x10を、NOTRUNCATE = 0x20に、確認= 0x40の、RemapRunDll = 0x80を、NoFixUps = 0x100の、IgnoreBaseClass = 0x200からの}

パブリック列挙体AssocStr {Command = 1、実行可能ファイル、FriendlyDocName、FriendlyAppName、NoOpen、ShellNewValue、DDECommand、DDEIfExec、DDEApplication、DDETopic}

}}


4


レジストリから直接このようなものを読むことは一般的に悪い考えです(すべてのhttp://blogs.msdn.com/oldnewthing/archive/2007/についてはhttp://blogs.msdn.com/oldnewthing[Raymond Chenのブログを参照)。 03/13 / 1868542.aspx [詳細] この特定の場合、必要なAPIは* shlwapi.h *の `+ AssocQueryString +`です。

これがCコードです。

TCHAR buf[1024];
DWORD sz = sizeof(buf) / sizeof(TCHAR);
AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_FRIENDLYDOCNAME, L".sql", NULL, buf, &sz);

C / CLIを介してC#からこれを使用できます。 .NET-friendly API; or call it directly via P/Invoke


4


いくつかの一般的なエラーから防ぐためのチェックを含む私のコード…​ それが役に立てば幸い :-)

システムを使用する。 System.Diagnosticsを使用します。 System.IOを使用します。 System.Runtime.InteropServicesを使用します。 System.Textを使用します。

namespace HQ.Util.Unmanaged {/// ///使用法:文字列executablePath = FileAssociation.GetExecFileAssociatedToExtension(pathExtension、 "open"); /// public static class FileAssociation {/// /// /// /// /// ///見つからない場合はnullを返しますpublic static string GetExecFileAssociatedToExtension(文字列ext、string verb = null){if(ext [0 ]!= '。'){ext = "。" ext; }

文字列executablePath = FileExtentionInfo(AssocStr.Executable、ext、verb); //(string.IsNullOrEmpty(executablePath)){executablePath = FileExtentionInfo(AssocStr.Command、ext、verb); // // 'open'動詞に対してのみ機能します。 // 'open'以外の動詞のコマンドを見つけるために必要

// if(!string.IsNullOrEmpty(executablePath))のみパスを抽出する

// Windows 8以降では、デフォルトのOpenWith.exe関連の実行可能ファイルを返さないようにします(!string.IsNullOrEmpty(executablePath))。 関連付けられたファイルとして返さないでください}} executablePathを返します。 executablePathを返します。 }

[DllImport( "Shlwapi.dll"、SetLastError = true、CharSet = CharSet.Auto)]静的外部結合AssocQueryString(AssocFフラグ、AssocStr str、文字列pszAssoc、文字列pszExtra、[Out] StringBuilder pszOut、[In] [Out] ref uint pcchOut);

プライベート静的文字列FileExtentionInfo(AssocStr assocStr、文字列doctype、文字列動詞){uint pcchOut = 0; AssocQueryString(AssocF.Verify、assocStr、doctype、動詞、null、参照pcchOut);

Debug.Assert(pcchOut!= 0); if(pcchOut == 0){return ""; }

StringBuilder pszOut = new StringBuilder((int)pcchOut); AssocQueryString(AssocF.Verify、assocStr、doctype、動詞、pszOut、ref pcchOut); pszOut.ToString()を返します。 }

【フラグ】パブリック列挙AssocF {Init_NoRemapCLSID = 0x1の、Init_ByExeName = 0x2の、Open_ByExeName = 0x2の、Init_DefaultToStar = 0x4の、Init_DefaultToFolder = 0x8という、NoUserSettings = 0x10を、NOTRUNCATE = 0x20に、確認= 0x40の、RemapRunDll = 0x80を、NoFixUps = 0x100の、IgnoreBaseClass = 0x200からの}

パブリック列挙体AssocStr {Command = 1、実行可能ファイル、FriendlyDocName、FriendlyAppName、NoOpen、ShellNewValue、DDECommand、DDEIfExec、DDEApplication、DDETopic}


}}


3


XPの未知のファイルタイプ用のもの FriendlyDocName以外のものと一緒に使用した場合、実際には正しい結果が得られない場合がありますが、これは単なる例です。

public static string FileExtentionInfo(AssocStr assocStr、string doctype){if((doctype.Length <= 1)||!doctype.StartsWith( "。"))return "";

uint pcchOut = 0。 AssocQueryString(AssocF.Verify、assocStr、doctype、null、null、参照pcchOut);

if(pcchOut == 0)return(doctype.Trim( '。')。ToUpper() "File");

StringBuilder pszOut = new StringBuilder((int)pcchOut); AssocQueryString(AssocF.Verify、assocStr、doctype、null、pszOut、ref pcchOut); pszOut.ToString()を返します。 }