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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2009, 16:57   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию перебор всех папок

добрый день всем.
Вот я пришол к вам с таким вопросом (пока без исходника...это пока).
Мне надо перебирать все папки на дисках, но для начала все папки, которые находятся на диске C:. Я нашол 2 темы связанные с этим, но ни чего так и не понял. Я вас не прошу чтобы вы написали кусочки, я просто хочу узнать с чего вообще начинать, а то я в этом полный 0, так сказать мне дали лабу и это затрагивается. знаю что мне надо использовать поиск в глубину, рекурсию (вот ее я хочу обойти), функциями пользоваться FindNext и FindNextFile, но просто ума не приложу с чего начинать. Создаю проект на VS C++ (Console Application). Помогите пожалуйста, толкните в нужное направление...но только не сильно. Спасибо заранее за помощь.
Вот найденые темы:
http://www.programmersforum.ru/showt...EF%E0%EF%EA%E8
http://www.programmersforum.ru/showt...EF%E0%EF%EA%E8
Olejik вне форума Ответить с цитированием
Старый 17.10.2009, 17:44   #2
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Здесь все подробно описано:

http://www.cyberguru.ru/cpp-sources/...sk-fajlov.html
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 17.10.2009, 18:55   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от nazavrik Посмотреть сообщение
Здесь все подробно описано:

http://www.cyberguru.ru/cpp-sources/...sk-fajlov.html
оппаньки, позыркаем )
спасибо за ссылочку заранее )
Olejik вне форума Ответить с цитированием
Старый 17.10.2009, 18:59   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

ой, а вот у мня вопросик, вот если писать программу, вот обьясниет мне пожалуйста, эта строка :
Код:
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
равноценна строке:
Код:
void main (void)
{
 LPCTSTR lpszFileName;
 LPSEARCHFUNC lpSearchFunc;
 BOOL bInnerFolders = TRUE;
 ...
}
просто вот как раз с такими делишками я не дружу
а если не похожи, то почему?
Olejik вне форума Ответить с цитированием
Старый 17.10.2009, 19:06   #5
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Код:
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
Здесь заголовок функции SearchFiles, в которую передаются атрибуты:

BOOL SearchFiles(
LPCTSTR lpszFileName, // Директория и маска файлов для поиска
LPSEARCHFUNC lpSearchFunc, // Функция, вызываемая для всех найденных файлов.
BOOL bInnerFolders /* = TRUE */) // TRUE - поиск в подпапках.
// FALSE - поиск только в заданной папке

Дальше идет реализация функции.

Код:
void main (void)
{
 LPCTSTR lpszFileName;
 LPSEARCHFUNC lpSearchFunc;
 BOOL bInnerFolders = TRUE;
 ...
}
Здесь просто объявляются три переменные.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 17.10.2009, 20:38   #6
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

так, часть я понял, а теперь еще вопросик, вот например я делаю кусочек за грницей функции
Код:
void main (void)
:
Код:
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
 ...
}
то вызываться должно так?
Код:
void main (void)
{
 ...
 SearchFile(тут я вписываю директорию и маску файлов для поиска  (в формате LPCTSTR),функция для всех найденных файлов,TRUE/FALSE)
 ...
}
и еще, директория - понятно;
маска файлов для поиска - что это значит;
директория и маска файлов для поиска находятся в одном...ммм так сказать массиве? Как это устроено?;
что значит функция для всех найденных файлов?
простите что столько много вопросов, просот на самом деле надо.
Olejik вне форума Ответить с цитированием
Старый 18.10.2009, 18:19   #7
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

маска файла - это его идентификатор: имя, расширение и пр.

Цитата:
что значит функция для всех найденных файлов?
Вы файл для чего ищете? Чтобы что-то с ним сделать, например, прочитать. Для этого Вы указываете функцию, к примеру, чтения файла. И если искомый файл будет найден, для него будет вызвана функция чтения файла.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 18.10.2009, 18:32   #8
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от nazavrik Посмотреть сообщение
маска файла - это его идентификатор: имя, расширение и пр.



Вы файл для чего ищете? Чтобы что-то с ним сделать, например, прочитать. Для этого Вы указываете функцию, к примеру, чтения файла. И если искомый файл будет найден, для него будет вызвана функция чтения файла.
да...точно..что то не догнал как-то... спасибо всем за помощь, сейчас уже мучу с прогой
Olejik вне форума Ответить с цитированием
Старый 18.10.2009, 22:16   #9
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

вот пописал я прогу и натолкнулся на одну вещь, мне надо вывести в данном каталоге все файлы, включая папки и я не могу догнать как это зделать, помогите пожалуйста, вот код:
Код:
	if (((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE))
	{
		return TRUE; // в противном случае выходим
	}
	do
	{
		if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
		{
			char file[MAX_PATH];
			if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0)
			{
				return FALSE;
			}
			strcpy(part, wfd.cFileName);
			printf("%s\n", file);
		}
	}
	while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
	FindClose (hSearch); // заканчиваем поиск
тут немнога изменено, вот на вход всей той проги (это не вся программа,это только кусочек) я подаю "*.*" и она находит все файлы который на каталоге : C:\,а нужно еще, чтобы программа в этом месте искала папки, но только в том каталоге,в котором даст пользователе (в данном случает C:\).

Последний раз редактировалось Olejik; 18.10.2009 в 22:41.
Olejik вне форума Ответить с цитированием
Старый 19.10.2009, 00:06   #10
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Вот моя реализация:

Код:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>

bool SearchFiles(TCHAR *buffer)
{
	HANDLE hFile;
	WIN32_FIND_DATA findFileData;
	TCHAR temp[MAX_PATH];
	
	SetCurrentDirectory(buffer);
	
	if((hFile=FindFirstFile(TEXT("*.*"), &findFileData))==INVALID_HANDLE_VALUE)
	{
		printf("Invalid file handle (%d)\n", GetLastError());
		return -2;
	}
	else 
	{	
		do
		{
			if(!strcmp(findFileData.cFileName, TEXT("."))||!strcmp(findFileData.cFileName, TEXT("..")))	
			{
				continue;
			}
			
			if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			{				
				strcpy(temp, buffer);
				strcat(buffer, "\\");
				strcat(buffer, findFileData.cFileName);
				
				SearchFiles(buffer);
				strcpy(buffer,temp);
				continue;
			}
			printf("File name is %s\n", findFileData.cFileName);
		}
		while(FindNextFile(hFile, &findFileData)!=0);
	}
	FindClose(hFile);
	return true;
}

int main(int argc, TCHAR* argv[])
{
	
	TCHAR buffer[MAX_PATH];
	TCHAR initStr[] = TEXT("");
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	DWORD dwError;

	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

	GetCurrentDirectory(sizeof(buffer), buffer);
	printf("Directory is %s\n", buffer);

	if(CreateProcess(NULL, initStr, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
	{
		printf("Create Process failed (%d)\n", GetLastError());
		return -1;
	}
	WaitForSingleObject(pi.hProcess, INFINITE);
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);

	if(!SearchFiles(buffer));
	{
		getch();
		return 0;
	}

	dwError = GetLastError();	

	if(dwError!=ERROR_NO_MORE_FILES)
	{
		printf("Error!%d", GetLastError());
		return -3;
	}

	getch();

	return 0;
}
Выводятся названия всех файлов из текущего каталога и всех подкаталогов.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех доступных значений! AquaKlaster Общие вопросы Delphi 40 02.03.2015 12:27
Перечислене всех папок doniyor Помощь студентам 1 06.08.2009 11:16
Реализовать перебор всех возможных IP-адресов (С++) ak74m Помощь студентам 0 09.04.2009 13:59
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44