Поиск директории в списке

Тема в разделе "MS Visual C++", создана пользователем BBDragon, 20 май 2008.

  1. BBDragon

    BBDragon Well-Known Member

    Регистрация:
    4 май 2008
    Сообщения:
    148
    Симпатии:
    0
    В программе создается стандартная диалоговая панель для выбора файлов (CFileDialog). После выбора одного
    или нескольких файлов необходимо в списке (CListBox) вывести имя каталога и имена выбранных файлов. Файлы
    можно выбирать только из одного каталога, в противном случае необходимо вывести предупреждение об ошибке.
    Если же файл или каталог открывается повторно - то не печатаем. Пока сделал только выбор файлов, вывод названия
    директории и неповторяющихся файлов. Необходимо теперь запретить выбор файлов из другого каталога. Если я правильно понял необходимо использовать функции FindString() и SelectString() класса CListBox.
    Не получается правильно организовать это..
    Пишу на Visual C++ 2003, вот фрагмент программы:

    [codebox]void CBrowserDlg::OnBrowse()
    {
    CFileDialog mFileOpen(TRUE,NULL,NULL,
    OFN_HIDEREADONLY,(LPCSTR)" Все(*.*)|*.*|ПРЛИ (*.bt8)|*.bt8||");
    mFileOpen.m_ofn.Flags |= OFN_ALLOWMULTISELECT; //для выбора нескольких файлов
    POSITION pos;

    CString strFileName;
    CString strDirName;
    CString strLeftPart;

    int result = mFileOpen.DoModal();
    // Проверяем как была закрыта диалоговая панель Open -
    // по нажатию кнопки OK или Cancel
    if(result == IDCANCEL)
    {
    // Если файлы не выбраны, т.е. нажата кнопка Canсel
    AfxMessageBox("File not selected");
    }

    else if(result == IDOK)
    {
    //файлы выбраны, так как нажата кнопка ОК
    pos = mFileOpen.GetStartPosition();
    while (pos != NULL ) //просматриваем строки с полными именами файлов по очереди
    {
    strFileName = mFileOpen.GetNextPathName(pos);//исходная строка
    strDirName="";
    while ((nLastSlash = strFileName.Find('\\')) > 0) // если слэш найден
    {
    strLeftPart=strFileName.Left(nLastSlash);
    strDirName=strDirName + strLeftPart + "\\";
    //обрезаем строку с именем файла слева после найденного слэша
    nStrLength=strFileName.Delete(0, nLastSlash+1);
    };
    //strDirName - имя пути открытого файла
    int nIndex = 0;
    //если путь отсутствует в списке - добавляем его!
    if (((nIndex=m_lboxFileList.FindString(nIndex, strDirName)) == LB_ERR)
    m_lboxFileList.AddString(strDirName);
    nIndex = 0; //если имя файла отсутствует в списке - добавляем его!
    if ((nIndex=m_lboxFileList.FindString(nIndex, strFileName)) == LB_ERR)
    m_lboxFileList.AddString(strFileName);

    }
    }
    }[/codebox]

    Думаю просматривать все элементы списка по очереди. Если строка содержит слэш "\", то очевидно, что имеем дело с названием директории. Далее сравниваем ее с ранее полученным названием директории (strDirName). Если совпадают - ничего не пишем, если разнятся - выдаем сообщение об ошибке. Если же в списке нет ни одной директории, то значит файлы открыты первый раз и имя каталога пишем сразу.
    Аналогично с именами файлов. Если имя файла есть в списке - ничего не делаем. Если же нет, то печатаем (естественно файлы должны быть из одного каталога).
    Заранее всем спасибо!
     
  2. BBDragon

    BBDragon Well-Known Member

    Регистрация:
    4 май 2008
    Сообщения:
    148
    Симпатии:
    0
    Главная проблема в том, что не могу понять как получить отдельно строку из списка, чтобы работать с ней. Помогите, кто знает, мне нужна всего лишь небольшая подсказка :)
     
  3. BBDragon

    BBDragon Well-Known Member

    Регистрация:
    4 май 2008
    Сообщения:
    148
    Симпатии:
    0
    Решил проблему своими силами. Нужно было воспользоваться функцией GetText. Итоговый вариант:

    void CBrowserDlg::OnBrowse()
    {
    CFileDialog mFileOpen(TRUE,NULL,NULL,
    OFN_HIDEREADONLY,(LPCSTR)" Все(*.*)|*.*|ПРЛИ (*.bt8)|*.bt8||");
    mFileOpen.m_ofn.Flags |= OFN_ALLOWMULTISELECT; //для выбора нескольких файлов
    POSITION pos;
    int nLastSlash, nStrLength;

    CString strFileName;
    CString strDirName;
    CString strFirstDirName;
    CString strLeftPart;

    int result = mFileOpen.DoModal();
    // Проверяем как была закрыта диалоговая панель Open -
    // по нажатию кнопки OK или Cancel
    if(result == IDCANCEL)
    {
    // Если файлы не выбраны, т.е. нажата кнопка Canсel
    AfxMessageBox("File not selected");
    }

    else if(result == IDOK)
    {
    //файлы выбраны, так как нажата кнопка ОК
    pos = mFileOpen.GetStartPosition();
    while (pos != NULL ) //просматриваем строки с полными именами файлов по очереди
    {
    strFileName = mFileOpen.GetNextPathName(pos);//исходная строка
    strDirName="";
    while ((nLastSlash = strFileName.Find('\\')) > 0) // если слэш найден
    {
    strLeftPart=strFileName.Left(nLastSlash);
    strDirName=strDirName + strLeftPart + "\\";
    //обрезаем строку с именем файла слева после найденного слэша
    nStrLength=strFileName.Delete(0, nLastSlash+1);
    };
    //strDirName - имя пути открытого файла
    int nIndex = 0;
    //если список пустой - добавляем в него путь и первый файл
    if ((nIndex=m_lboxFileList.GetCount()) == 0)
    {
    m_lboxFileList.AddString(strDirName);
    //добавляем имя файла, ибо других в списке нет
    m_lboxFileList.AddString(strFileName);
    }
    else //список непуст
    {
    m_lboxFileList.GetText(0, strFirstDirName);
    //сравниваем название каталога с первым элементом списка
    //им является название первого открытого каталога
    if (strDirName == strFirstDirName)
    //открыт тот же самый каталог
    {
    nIndex = 0;
    //если имя файла отсутствует в списке - добавляем его!
    if ((nIndex=m_lboxFileList.FindString(nIndex, strFileName)) == LB_ERR)
    m_lboxFileList.AddString(strFileName);
    }
    //попытка открыть файлы из другого каталога
    else AfxMessageBox("Select file from same directory!");
    }
    }
    }
    }

    Надеюсь это кому-нибудь будет полезным :)
     
Загрузка...

Поделиться этой страницей