Получение имени (пути) файла который открывает данные документы - C#
Формулировка задачи:
Допустим я беру текстовый документ с расширением .txt и он имеет определенную иконку (блокнота по дефолту)
Какая иконка зависит от того - какое приложение выбрано по стандарту для открытия данного типа файлов.
В общем. Как узнать что это за приложение средствами C#.
Т.Е на входе есть например C:/..../read.txt
И получить должен я %windir%/system32/notepad.exe
Решение задачи: «Получение имени (пути) файла который открывает данные документы»
textual
Листинг программы
[Flags]
private enum ASSOCF
{
NONE = 0x00000000,
INIT_NOREMAPCLSID = 0x00000001,
INIT_BYEXENAME = 0x00000002,
OPEN_BYEXENAME = 0x00000002,
INIT_DEFAULTTOSTAR = 0x00000004,
INIT_DEFAULTTOFOLDER = 0x00000008,
NOUSERSETTINGS = 0x00000010,
NOTRUNCATE = 0x00000020,
VERIFY = 0x00000040,
REMAPRUNDLL = 0x00000080,
NOFIXUPS = 0x00000100,
IGNOREBASECLASS = 0x00000200,
INIT_IGNOREUNKNOWN = 0x00000400,
INIT_FIXED_PROGID = 0x00000800,
IS_PROTOCOL = 0x00001000
}
private enum ASSOCSTR
{
COMMAND = 1,
EXECUTABLE,
FRIENDLYDOCNAME,
FRIENDLYAPPNAME,
NOOPEN,
SHELLNEWVALUE,
DDECOMMAND,
DDEIFEXEC,
DDEAPPLICATION,
DDETOPIC,
INFOTIP,
QUICKTIP,
TILEINFO,
CONTENTTYPE,
DEFAULTICON,
SHELLEXTENSION,
DROPTARGET,
DELEGATEEXECUTE,
SUPPORTED_URI_PROTOCOLS,
MAX
}
[DllImport( "Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode )]
private static extern int AssocQueryString (
ASSOCF flags,
ASSOCSTR str,
string pszAssoc,
string pszExtra,
StringBuilder pszOut,
ref int pcchOut
);
static void Main ( )
{
var buff = new StringBuilder( 255 );
var length = buff.Capacity;
if ( 0 != AssocQueryString( ASSOCF.NONE, ASSOCSTR.EXECUTABLE, ".rtf", "open", buff, ref length ) )
{
Console.WriteLine( "Error: " + Marshal.GetLastWin32Error() );
return;
}
Console.WriteLine( buff.ToString() );
}