Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2009, 17:38   #1
revan-8
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 15
По умолчанию удаление файлов/каталогов

Собственно пишу программу командной строки (в визуал студио 2008).

Помогите пожалуйста исправить код. Нужно чтобы удаляло рекурсивно каталог (задается в сорсе) и все что в нем находится.

Собственно вот код, помоему он близок...

Код:
#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;

int main() 
{ 
// удаляем каталог 

DeleteFile("D:dir");

cout << "Deleted\n";
 
getch();

return 0; 
}
Только вот на DeleteFile оно ругается, и будет ли эта функция работать для удаления каталогов ? Надо чтоб каталог удалялся...
revan-8 вне форума Ответить с цитированием
Старый 11.07.2009, 18:17   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
#include <iostream>
#include <Windows.h>

BOOL DeleteFolder(LPCSTR szPath);

int main() 
{
	if(DeleteFolder("C:\\Folder") == TRUE)
		std::cout << "Folder is deleted!\n";

	std::cin.get();
	return 0;
}

//Рекурсивное удаление каталога
BOOL DeleteFolder(LPCSTR szPath)
{
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind = INVALID_HANDLE_VALUE;
	DWORD dwError,dwAttrs;
	BOOL bRes;
	int nLength;
	char cPath[MAX_PATH],cCurrentFile[MAX_PATH];

	if (szPath == NULL)
		return FALSE;

	if (lstrcmpi(szPath + 1, TEXT(":\\")) == 0 || szPath[0] == '\\' || szPath[0] == '\0')
		return FALSE;

	//Обьекта уже нету
	dwAttrs = GetFileAttributes(szPath);
	if (dwAttrs == INVALID_FILE_ATTRIBUTES)
		return TRUE;

	//Если обьект не директория 
	if (~dwAttrs & FILE_ATTRIBUTE_DIRECTORY)
		return FALSE;       

	SetLastError(0);

	//Пробуем сразу удалить директорию
	bRes = RemoveDirectory(szPath);
	if (bRes == TRUE)
		return TRUE;

	if (bRes == FALSE  && GetLastError() != ERROR_DIR_NOT_EMPTY)
		return FALSE;

	nLength = lstrlen(szPath);

	if (nLength + lstrlen("\\*.*") + 1> MAX_PATH)
		return FALSE;

	if (szPath[nLength - 1] == '\\')
		wsprintf(cPath,"%s*.*",szPath);
	else
		wsprintf(cPath,"%s\\*.*",szPath);

	hFind = FindFirstFile(cPath, &FindFileData);
	if (hFind == INVALID_HANDLE_VALUE)
		return FALSE;

	lstrcpy(cPath,szPath);

	if (cPath[nLength - 1] == '\\')
		cPath[nLength - 1] = TEXT('\0');

	do
	{
		//Опускаем начальные . и ..
		if (lstrcmpi(FindFileData.cFileName, ".") == 0 || lstrcmpi(FindFileData.cFileName, "..") == 0)
			continue;   

		//Пропускаем слишком длинные имена файлов
		if (lstrlen(cPath) + lstrlen("\\") +  lstrlen(FindFileData.cFileName) + 1 > MAX_PATH)
			continue;

		wsprintf(cCurrentFile,"%s\\%s",cPath,FindFileData.cFileName);
		//Удаляем папку
		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{    //Сбрасываем аттрибуты
			if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
			{
				FindFileData.dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
				SetFileAttributes(cCurrentFile,FindFileData.dwFileAttributes);
			}

			bRes = DeleteFolder(cCurrentFile);
		}
		//Иначе удаляем файл
		else
		{

			if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ||
				(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
				SetFileAttributes (cCurrentFile, FILE_ATTRIBUTE_NORMAL);

			DeleteFile (cCurrentFile);
		}
	}
	while (FindNextFile(hFind,&FindFileData));

	dwError = GetLastError();

	if (hFind != INVALID_HANDLE_VALUE)
		FindClose(hFind);

	if (dwError != ERROR_NO_MORE_FILES)
		return FALSE;

	bRes = RemoveDirectory(szPath);

	return bRes;
}
PS. revan-8 заголовок conio - он не поддерживается стандартом.
вместо getch() используйте std::cin.get();
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 11.07.2009, 18:57   #3
revan-8
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 15
По умолчанию

выдает 18 ошибок начиная с 29 строки... и везде cannot convert, может библу какую-нибудь еще подключить надо...

Последний раз редактировалось revan-8; 11.07.2009 в 18:59.
revan-8 вне форума Ответить с цитированием
Старый 11.07.2009, 19:50   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
error C2664: 'lstrcmpiW' : cannot convert parameter 1 from 'LPCSTR' to 'LPCWSTR'
такое пишет??
если да то в настройках проекта так сделай :
Alt + F7 -> Configuration Properties -> Character Set поставь Not Set
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 12.07.2009, 20:49   #5
revan-8
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 15
По умолчанию

ошибка та но как убрать эту опцию так и не понял, эта комбинация не работает, не могу найти
revan-8 вне форума Ответить с цитированием
Старый 12.07.2009, 22:02   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Поставьте перед всеми строками и символами букву L
Код:

   DeleteFolder(L"C:\\Folder")
   if (lstrcmpi(szPath + 1, L":\\") == 0 || szPath[0] == L'\\' || szPath[0] == L'\0')
и т.д...

заменить LPCSTR на LPCWSTR и char на wchar_t. Раз уж поменять с UNICODE не получается
netrino вне форума Ответить с цитированием
Старый 24.07.2009, 22:37   #7
revan-8
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 15
По умолчанию

не СПС можно лучше поподробнее как на юникод поставитъ?
revan-8 вне форума Ответить с цитированием
Старый 24.07.2009, 23:15   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от revan-8 Посмотреть сообщение
не СПС можно лучше поподробнее как на юникод поставитъ?
Насколько я понял, у вас уже включён Unicode. А вообще в настройках проекта(Alt+F7) в вкладке Configuration Properties->General, в поле Character Set выставить Use Unicode Character Set для комплиции с Unicode-версиями ф-ций, или Use Multi-Byte Character Set для компиляции с ANSI-версиями ф-ций.
Макрос TEXT("x") в зависимости от настроек раскрывается либо в L"x"(UNICODE) либо в "x"(ANSI) потому советую использовать его, если есть желание сделать две версии программы - с поддержкой юникод и без
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление файлов Liones Общие вопросы Delphi 9 20.05.2009 13:29
Удаление, файлов Vladya Помощь студентам 4 22.12.2008 22:40
Копирование файлов и каталогов перетаскиваением между двумя окнами SANTA_KLAUD Общие вопросы Delphi 3 28.05.2008 21:52
Удаление файлов Amery Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.05.2008 14:46
Создание удаление каталогов, копирование файлов. Alar Общие вопросы Delphi 1 18.12.2007 18:30