Получение имени (пути) файла который открывает данные документы - 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() );
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы