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

BBDragon

Well-known member
04.05.2008
148
0
#1
В программе создается стандартная диалоговая панель для выбора файлов (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). Если совпадают - ничего не пишем, если разнятся - выдаем сообщение об ошибке. Если же в списке нет ни одной директории, то значит файлы открыты первый раз и имя каталога пишем сразу.
Аналогично с именами файлов. Если имя файла есть в списке - ничего не делаем. Если же нет, то печатаем (естественно файлы должны быть из одного каталога).
Заранее всем спасибо!
 

BBDragon

Well-known member
04.05.2008
148
0
#2
Главная проблема в том, что не могу понять как получить отдельно строку из списка, чтобы работать с ней. Помогите, кто знает, мне нужна всего лишь небольшая подсказка :)
 

BBDragon

Well-known member
04.05.2008
148
0
#3
Решил проблему своими силами. Нужно было воспользоваться функцией 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!");
}
}
}
}

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