Проблемы в коде для удаления директории.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
4ygynOK
Сообщения: 2
Зарегистрирован: 10 окт 2013, 18:21

Приведу код:

Код: Выделить всё

BOOL CUGODatabaseMng: :D eleteDir(DWORD BUGO_Id)
{
	ASSERT(m_pDatabaseMng);
	if (!m_pDatabaseMng)
		return FALSE;
	
	BOOL bParent = TRUE;
	BOOL bDelParent = TRUE;
	try
	{
		std::list<DWORD> lstIds;

		CString sSQL;
		sSQL.Format(_T("SELECT ID FROM BUGO WHERE PARENT_ID=%d"), BUGO_Id);

		ADODB::_RecordsetPtr spRS = m_pDatabaseMng->OpenRecordset(sSQL);
		long nRecordCount = spRS->GetRecordCount();
		
		for (long nRecord = 0; nRecord < nRecordCount; ++nRecord)
		{
			lstIds.push_back((long)spRS->GetFields()->GetItem(_T("ID"))->GetValue());
			spRS->MoveNext();
		}
		
		if (nRecordCount > 1)
		{
			bParent = TRUE; // проверка наличия вложенных каталогов
		}

		spRS->Close();

		for (std::list<DWORD>::iterator it = lstIds.begin(); it != lstIds.end(); ++it)
		{
			if (bParent)
				bDelParent = FALSE; //если есть вложенные каталоги, то родительская не удаляется
			
			if (!DeleteDir(*it))
				return FALSE;

			
			
		}

		if (bDelParent)
		{
			sSQL.Format(_T("DELETE FROM BUGO WHERE ID=%d"), BUGO_Id);
			VERIFY(m_pDatabaseMng->ExecuteSQL(sSQL));
			return TRUE;
		}


	}
	catch (_com_error& e)
	{
		if (AfxMessageBox(CString(_T("Удаление каталога невозможно!\n")) + (LPCTSTR)e.Description() + CString(_T("\nПродолжить удаление?")),MB_OKCANCEL) == IDOK)
		{
			return TRUE;
		}
		else return FALSE;
	}

	return FALSE;
}
Данный код работает на корректное удаление директорий только до уровня вложенности 2, а надо бы до любого, как мне это провернуть? Помогите пожалуйста, если что-то необходимо, то поясню очень быстро.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Не очень понятно, чего хочется добиться. Судя по коду, в дереве BUGO удаляться будут только те кортежи, у которых нету парентов. А вот это условие вообще не понятно:

Код: Выделить всё

        if (nRecordCount > 1)
         {
             bParent = TRUE; // проверка наличия вложенных каталогов
         }
Почему сравнение не с нулём? Ведь если этот запрос нашёл хоть один кортеж, то текущий BUGO уже является парентом. Или один чайлд имеют все BUGO, но он хранит какие-то системые данные?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
4ygynOK
Сообщения: 2
Зарегистрирован: 10 окт 2013, 18:21

Согласен можно сравнить и с нулем, это значение показывает количество у него подкаталогов, если 0 то нету если нет то есть.
Вообще необходимо сделать чтобы в дереве BUGO: по нажатию ОК из catch удалялись все каталоги которые возможно, а при нажатии ОТМЕНА удалялись все каталоги до первого который нельзя удалить.
niko71
Сообщения: 1
Зарегистрирован: 16 окт 2013, 10:39

Требуется модерация форумов и новостей. Хорошая подработка со свободным графиком. Почасовая оплата 280 рублей в час. Пишите на email: service24int@gmail.com
vasilenko_konstantin
Сообщения: 5
Зарегистрирован: 16 окт 2013, 02:42

Парси путь к директории. Удаляй директории начиная с последней. Пользуйся АПИшными функциями.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

vasilenko_konstantin, API функции тут не при чём. Директории в базе данных хранятся. По коду же видно...

4ygynOK, вообще-то я не могу понять в чём проблема тогда. Никаких ограничителей на вложенность вызовов в коде нету. Не пробовал дебажить? В дебагере проблема не видна?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить