powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / удалить содержимое папки (её саму не надо)
13 сообщений из 13, страница 1 из 1
удалить содержимое папки (её саму не надо)
    #39056062
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нижеприведённый текст не удаляет вложенные папки.
Файлы из них удаляются.
Более того после выполнения некоторые папки не могут быть удалены из проводника или Commander пока не выполнишь перезагрузку.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
void RemoveDirContent(char *Dir){
char buf[256],buf1[256];
bool fnd;
struct ffblk ffb;
char *name;
int atr;

if(access(Dir,0)!=0){
	throw Exception("RemoveDirContent():Folder does not exist");
}
strcpy(buf,Dir);
strcat(buf,"\\*.*");
atr=FA_DIREC | FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_ARCH;
fnd=(findfirst(buf,&ffb,atr)==0);

name=ffb.ff_name;
while(fnd){
	if(strcmp(name,".")==0 || strcmp(name,"..")==0)
		goto mimo;
	strcpy(buf1,Dir);
	strcat(buf1,"\\");
	strcat(buf1,name);
	if(ffb.ff_attrib & FA_DIREC){
		RemoveDirContent(buf1); // можно remove();
 /*
		int errcode;
		if(!RemoveDirectory(buf1)){
			errcode=GetLastError(); // получается 32 - файл недоступен
		}
 */
	}
	DeleteFile(buf1); // для файлов пробовал ещё unlink, _unlink, remove
mimo:
	fnd=findnext(&ffb)==0;
}
return;
}



В качестве прототипа я ипользовал своюже ф-ю написанную лет 20 назад для обхода содержимого каталога (но не удаления)
Всё прекрасно работало.
Кто нибудь может объяснить? Заранее спасибо за отклики.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056079
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замени DeleteFile(buf1) на printf("file %s\n", buf1) и смотри что у тебя реально делается.
Раскомментируй RemoveDirectory() и замени на printf("dir %s\n", buf1)

Учись отлаживать свой код.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056092
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну неужели вы думаете что я не прокрутил всё.
И не просмотрел изменения всех переменных.
Бессмысленный и высокомерный (без основания ответ).
Вот код ещё раз.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
//------------------------------------------
void RemoveDirContent(char *Dir){
char buf[256],buf1[256];
bool fnd;
struct ffblk ffb;
char *name;
int atr;

if(access(Dir,0)!=0){
	throw Exception("RemoveDirContent():Folder does not exist");
}
strcpy(buf,Dir);
strcat(buf,"\\*.*");
atr=FA_DIREC | FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_ARCH;
fnd=(findfirst(buf,&ffb,atr)==0);

name=ffb.ff_name;
while(fnd){
	if(strcmp(name,".")==0 || strcmp(name,"..")==0)
		goto mimo;
	strcpy(buf1,Dir);
	strcat(buf1,"\\");
	strcat(buf1,name);
	if(ffb.ff_attrib & FA_DIREC){
		RemoveDirContent(buf1);
		RemoveDirectory(buf1);
	} else {
		DeleteFile(buf1);
	}
mimo:
	fnd=findnext(&ffb)==0;
}
return;
}
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056119
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07Ну неужели вы думаете что я не прокрутил всё.
И не просмотрел изменения всех переменных.
Да, именно это мы все тут и думаем. А ещё мы думаем, что хорошей идеей будет проверять
возвращаемое функциями значение и выводить текст ошибки буде таковая возникнет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056188
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07Ну неужели вы думаете что я не прокрутил всё.
И не просмотрел изменения всех переменных.
Бессмысленный и высокомерный (без основания ответ).
какой вопрос - такой ответ.

Есть такая шутка: "Если программа выполняет мистические действия - значит вы написали что-то невороятно глупое". И в этой шутке нет ни капли шутки.

muk07Вот код ещё раз.
И чего мне с ним делать? код из каких-то оберток. Вот тебе ответ моего компилятора (MSVC) на твой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
error C2079: 'ffb' uses undefined struct 'RemoveDirContent::ffblk'
error C3861: 'access': identifier not found
error C3861: 'Exception': identifier not found
'FA_DIREC' : undeclared identifier
'FA_RDONLY' : undeclared identifier
'FA_HIDDEN' : undeclared identifier
'FA_SYSTEM' : undeclared identifier
'FA_ARCH' : undeclared identifier
'findfirst': identifier not found
...


что толку от твоего кода если ты даже не удосужился указать чем ты его компилируешь?
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056213
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тебе код на С с Win API
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void Dir(char *Dir) {
	char buf[MAX_PATH];
	strcpy(buf,Dir);
	if (buf[strlen(Dir) - 1] != '\\') strcat(buf,"\\");
	strcat(buf,"*.*");
	WIN32_FIND_DATA FindFileData;
	HANDLE h = FindFirstFile(buf, &FindFileData);
	if (h != INVALID_HANDLE_VALUE) {
		do {
			if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
				printf("dir %s\n", FindFileData.cFileName);
			} else {
				printf("file %s\n", FindFileData.cFileName);
			}
		} while(FindNextFile(h, &FindFileData));
		FindClose(h);
	}
}


Дальше сам
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056400
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если бы ты немного подумал, то подключил бы соответствующие include.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056501
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07В качестве прототипа я ипользовал своюже ф-ю написанную лет 20 назад для обхода содержимого каталога (но не удаления)
Всё прекрасно работало.
Кто нибудь может объяснить? Заранее спасибо за отклики.
20 - лет это достаточно солидный срок для роста себя как инженера. Казалось-бы ... при чём тут С++
и компилляторы. Ты должен уметь удалять файлы любым инструментом в любом порядке.

И если ты работаешь под Windows и без посредников то нужно использовать юз-кейс который
рекомендован производителем. Обрати внимание на проверки retvalue и GetLastError

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx

Обрати внимание также на то что ты забываешь сделать операции по закрытию хендлов FindClose(..)

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx

Если ты работаешь под Linux/C++ то там соотв есть свою нюансы при работе с ФС но
тоже есть регулярные проверки СТАТУСА ошибки которые игнорить нельзя иначе
прослывёшь нубасиком и будешь крепко бит другими разработчиками.

Вот как то в таком вот аспекте.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056570
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07если бы ты немного подумал, то подключил бы соответствующие include.
Погуглил немного Похоже это какой-то древний диалект С времен TurboC под dos.
Современным компиляторам include не поможет.
Код: plaintext
1.
fatal error C1083: Cannot open include file: 'dir.h': No such file or directory


Чем ты его компилируешь?

Возьми мой пример за основу 18170583 и допили в нужном тебе направлении. Вполне возможно причина в незакрытых хэндлах.

И не забывай проверять что возвращает DeleteFile(). Открытый файл удалить не получится.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056580
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07если бы ты немного подумал, то подключил бы соответствующие include.
Хоть и не мне адресовано, но ... А зачем мне это надо?
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056583
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07
Код: plaintext
1.
			errcode=GetLastError(); // получается 32 - файл недоступен


https://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx ERROR_SHARING_VIOLATION

32 (0x20)

The process cannot access the file because it is being used by another process.
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056611
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению выяснилось, что никто ответа на вопрос не знает, используемых функций тоже, но желает высказаться.
Непонятно зачем.
Кстати, это стало характерно для форума С++ последние годы.
Модератор: Мы просим воздержаться от риторических изречений и постов не по теме топика
...
Рейтинг: 0 / 0
удалить содержимое папки (её саму не надо)
    #39056615
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07выяснилось, что никто ответа на вопрос не знает
Да ну?..
maytonты забываешь сделать операции по закрытию хендлов FindClose(..)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / удалить содержимое папки (её саму не надо)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]