Средства диалога выбора файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть ли какие-то минимальные средства для реализации диалога выбора файла на С (в консольной программе) другими словами, чтобы не писать стандартное типа
FILE * f;
 f=fopen("dan.txt","r");
а чтобы хотя бы например для данной папки получить например внутри программы весь список файлов скажем с расширением *txt или *.dat И дать возмжность выбора пользователю программы?

Решение задачи: «Средства диалога выбора файла»

textual
Листинг программы
#include <stdlib.h>
#include <shlobj.h>
#include <stdio.h>
 
BOOL SelectFile(char * sPath, const char * szTitle)
{
    BOOL bRet = FALSE;
    LPCITEMIDLIST lpItemDList;
    BROWSEINFO bi = {
        NULL, 
        NULL, 
        sPath,
        szTitle,
        BIF_DONTGOBELOWDOMAIN|BIF_BROWSEINCLUDEFILES,
        NULL,
        NULL,
        0
    };
    if((lpItemDList=SHBrowseForFolder(&bi)))
    {
        if((bRet = SHGetPathFromIDList(lpItemDList, sPath)))
            GetShortPathName((LPCTSTR)sPath,sPath,strlen(sPath));
        else
            sPath[0] = '\0';
    }
    return bRet;
}
 
int main()
{
    char sPath[256] = {0};
    if(!SelectFile(sPath, "Âûáåðèòå ГґГ*éë èëè ГЄГ*ГІГ*ëîã"))
        printf("Error open path %s\n",strerror(GetLastError()));
    else
        printf("Selected path %s\n",sPath);
    system("pause");
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек: stdlib.h, shlobj.h, printf.h
  2. Определение функции SelectFile с двумя параметрами: sPath (строка пути к файлу) и szTitle (строка заголовка диалога выбора файла).
  3. Инициализация переменной bRet в качестве логического значения FALSE.
  4. Создание структуры BROWSEINFO с полями: hWndOwner (дескриптор окна), pidl (дескриптор элемента списка), sPath (путь к файлу), szTitle (заголовок диалога), wFlags (флаги для функции SHBrowseForFolder), lParam (параметр для функции SHBrowseForFolder), pszDisplayName (строка для функции SHBrowseForFolder), cchDisplayName (размер строки pszDisplayName).
  5. Если функция SHBrowseForFolder вернула ненулевой результат, то инициализируем переменную bRet в качестве логического значения TRUE и вызываем функцию SHGetPathFromIDList для получения пути к файлу из дескриптора элемента списка.
  6. Если функция SHGetPathFromIDList вернула ненулевой результат, то вызываем функцию GetShortPathName для получения краткого пути к файлу.
  7. Если функция SHGetPathFromIDList вернула ненулевой результат, то выводим сообщение об ошибке.
  8. Если функция SHGetPathFromIDList вернула ненулевой результат, то выводим путь к файлу.
  9. Если функция SHBrowseForFolder вернула ненулевой результат, то выводим сообщение об ошибке.
  10. Если функция SHBrowseForFolder вернула ненулевой результат, то выводим путь к файлу.
  11. Если функция SHBrowseForFolder вернула ненулевой результат, то вызываем функцию system для приостановки выполнения программы до нажатия клавиши.
  12. Возвращаем 0 в качестве результата выполнения функции main.

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


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

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

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