Страница 1 из 1

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

Добавлено: 10 окт 2013, 18:26
4ygynOK
Приведу код:

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

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, а надо бы до любого, как мне это провернуть? Помогите пожалуйста, если что-то необходимо, то поясню очень быстро.

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

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

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

        if (nRecordCount > 1)
         {
             bParent = TRUE; // проверка наличия вложенных каталогов
         }
Почему сравнение не с нулём? Ведь если этот запрос нашёл хоть один кортеж, то текущий BUGO уже является парентом. Или один чайлд имеют все BUGO, но он хранит какие-то системые данные?

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

Добавлено: 11 окт 2013, 18:31
4ygynOK
Согласен можно сравнить и с нулем, это значение показывает количество у него подкаталогов, если 0 то нету если нет то есть.
Вообще необходимо сделать чтобы в дереве BUGO: по нажатию ОК из catch удалялись все каталоги которые возможно, а при нажатии ОТМЕНА удалялись все каталоги до первого который нельзя удалить.

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

Добавлено: 16 окт 2013, 10:40
niko71
Требуется модерация форумов и новостей. Хорошая подработка со свободным графиком. Почасовая оплата 280 рублей в час. Пишите на email: service24int@gmail.com

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

Добавлено: 16 окт 2013, 13:07
vasilenko_konstantin
Парси путь к директории. Удаляй директории начиная с последней. Пользуйся АПИшными функциями.

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

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

4ygynOK, вообще-то я не могу понять в чём проблема тогда. Никаких ограничителей на вложенность вызовов в коде нету. Не пробовал дебажить? В дебагере проблема не видна?