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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 20:04   #1
A93
Пользователь
 
Регистрация: 22.09.2009
Сообщений: 18
Сообщение Доработка

Привет всем! Можете помочь доработать код он ищет файлы в каталоге заданного формата. А мне надо чтоб он искал файлы в подкаталогах тоже .

Код:
#include <iostream>
#include <windows.h>
#include <winioctl.h>
#include <winbase.h>
#include <winbase.h>
#include <fstream>
using namespace std;
#define MAX_SZ	0x69

int main()
{
WIN32_FIND_DATA FindFileData;
	HANDLE hf;
	hf=FindFirstFile("f:\\*k", &FindFileData);
	if (hf!=INVALID_HANDLE_VALUE)
	{
		do
		{
			cout << FindFileData.cFileName << endl;
		}
		while (FindNextFile(hf,&FindFileData)!=0);
		FindClose(hf);
	}

return 0;
}
Возможно, здесь есть лишние библиотеки на них можно не обращать внимание.

Последний раз редактировалось Stilet; 27.11.2009 в 14:51.
A93 вне форума Ответить с цитированием
Старый 26.11.2009, 20:13   #2
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

как то так
Код:
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;
}
Olejik вне форума Ответить с цитированием
Старый 27.11.2009, 13:28   #3
A93
Пользователь
 
Регистрация: 22.09.2009
Сообщений: 18
По умолчанию

Как я здесь понимаю TCHAR *buffer это каталог в который будем искать файлы.
A93 вне форума Ответить с цитированием
Старый 28.11.2009, 11:16   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

да, это передача каталога в функцию откуда будем начинать, можешь туда передать C:\\ и будет искать файлы от C:\
Olejik вне форума Ответить с цитированием
Старый 28.11.2009, 13:29   #5
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Еще раз выкладываю код, производящий рекурсивный поиск на ВСЕХ доступных дисках, а так же каталогах с любым уровнем вложенности:

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

//функция поиска
bool seek(LPCTSTR lpszFileName, BOOL bInnerFolders)
{                     
	LPTSTR part;
	char tmp[MAX_PATH];				// temporary array
	char name[MAX_PATH];

	HANDLE hSearch = NULL;
	WIN32_FIND_DATA wfd;
	memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
	
	//search in embeded folders for first
	if(bInnerFolders)
	{
		if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) 
			return FALSE;
		lstrcpy(name, part);
		lstrcpy(part, "*.*");

		//if folder exists, down to it
		wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
		if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
			do
			{
				//if current folder is a service folders? which no need to check
				if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))            
					continue;
				if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //if it's a folder
				{
					// making a new path
					char next[MAX_PATH];
					if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
					lstrcpy(part, wfd.cFileName);
					lstrcat(next, "\\");
					cout << next << endl;
					lstrcat(next, name);
					//recourse down
					seek(next, TRUE);
				}
			}
			while (FindNextFile(hSearch, &wfd)); //finding next file in folder
			FindClose (hSearch); // closing a search descriptor
	}
	if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) 
		return TRUE; 
	do
	if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // is it's a file
	{
		char file[MAX_PATH];
		if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
		lstrcpy(part, wfd.cFileName);
		
		//adding its to a result list
		cout << file << endl;
	}
	while (FindNextFile(hSearch, &wfd));	// next file in folder
	FindClose (hSearch);					// close search descriptor

	return TRUE;
}
//главная функция   
int main()
{
/*
Вызываем функцию seek, указав ей искать все *.txt файлы на диске
C:\, так же второй параметр, false, говорит функции не заглядывать
во вложенные каталоги, а искать только в корневом). Если задать этот
параметр как true - программа начнет перебирать все каталоги.
Так же мы проверяем значение, которое возвращает функция, если это false - выводим сообщение об ошибке.
*/
	if(!seek("c:\\*.txt", false))
		cout << "Searching failed" << endl;
	return 0;
}
P.S. Используйте поиск в этой ветке...
oleg kutkov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка портала muh Фриланс 1 29.09.2009 21:31
Доработка программы Дмитрий Н. Общие вопросы Delphi 5 15.04.2009 20:17
Доработка программы!! Дмитрий Н. Компоненты Delphi 0 15.04.2009 11:26
Доработка функции Черничный Работа с сетью в Delphi 6 01.08.2008 15:51