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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.08.2009, 13:25   #1
Flippp
Пользователь
 
Регистрация: 05.03.2009
Сообщений: 62
По умолчанию Поиск файла по всему компьютеру!!!!!

Здрасте вот наткнулся на проблему.
Код:
Есть код:
       if( (hFile = _findfirst( "*.exe", &info_about_file )) == -1)
       { 
       ...
       }
       else
       {
          ...
           }
       _findclose( hFile );
так вот этот код исчет файл по заданной маске,
а как организовать поиск этого файла по всему компьютеру по имени и размеру,т.e проверка каждой папки на наличии этого файла.

Последний раз редактировалось Flippp; 04.08.2009 в 13:36.
Flippp вне форума
Старый 04.08.2009, 13:47   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

1. Получаете все логические диски на компьютере
2. Пробуете перейти на диск, если успешно - рекурсивно, получая список каталогов, просматриваете все, пока не найдете нужный файл.

Получение всех логических дисков:
Код:
#include <windows.h>

DWORD Disks = GetLogicalDrives();
char temp[2];
	for(int dc = 0; dc < 32; dc++)
	{
		if (Disks & (1<<dc))
		{			
			temp[1]=0;
			temp[0]='A'+dc;
			cout << temp << endl;
		}
	}
Ну а список каталогов получате, точно так же, как ищутся файлы с помощью FindFirstFile, указав тип файла - каталог (т.к. каталог - то же файл):

Код:
  WIN32_FIND_DATA FindFileData = FILE_ATTRIBUTE_DIRECTORY;
  HANDLE hFind; 

  hFind = FindFirstFile("*", &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) 
    return 1;
  else 
  {
    cout << FindFileData.cFileName << endl;
    FindClose(hFind);
    return 0;
  }
В качестве первого параметра FindFirstFile указываете следущий найденный выше диски и следующий, каталог, пока не переберете все диски и все каталоги.

Последний раз редактировалось oleg kutkov; 04.08.2009 в 14:05.
oleg kutkov вне форума
Старый 04.08.2009, 13:49   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как правило поиск оформляется в процедуру, которая вызывается рекурсивно. Зделай и ты так.
I'm learning to live...
Stilet вне форума
Старый 04.08.2009, 13:56   #4
Flippp
Пользователь
 
Регистрация: 05.03.2009
Сообщений: 62
По умолчанию

а можно пожалуйста небольшой небольшой пример.
Flippp вне форума
Старый 04.08.2009, 14:06   #5
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Выше я пример пример как получить все диски и как искать все каталоги по в заданном месте, как искать файлы Вы знаете.
Как организовать рекурсию нужно пояснять.
oleg kutkov вне форума
Старый 04.08.2009, 16:56   #6
Flippp
Пользователь
 
Регистрация: 05.03.2009
Сообщений: 62
По умолчанию

Код:
#include <iostream.h>
main(int argc, char* argv[]){
WIN32_FIND_DATA FindFileData;
  HANDLE hFind; 
  FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
  hFind = FindFirstFile("*", &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE) 
    return 1;
  else 
  {  
    while( FindNextFile( hFind,&FindFileData ) == 0 )
    cout << FindFileData.cFileName << endl;
    FindClose(hFind);
    return 0;
  }
}
Не понимаю как сделать поиск следушего файла?
выскакивает ошибка:cannot convert `WIN32_FIND_DATA' to `_WIN32_FIND_DATAA*' for argument `2' to `BOOL FindNextFileA(void*, _WIN32_FIND_DATAA*)'
Flippp вне форума
Старый 04.08.2009, 17:40   #7
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Это у вас во время компиляции выскакивает ?
Вы windows.h в начале подключили ?
oleg kutkov вне форума
Старый 04.08.2009, 19:45   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

В настройках проекта поставьте Use Multi-Byte Character Set
Вот вам пример поиска
Код:
BOOL CSeeker::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, "\\");
					SetWindowText(window, next);
					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
		addFileToList(file);
	}
	while (FindNextFile(hSearch, &wfd));	// next file in folder
	FindClose (hSearch);					// close search descriptor

	return TRUE;
}
Но лучше сделайте что-то типа индексирования. Тоесть запомните все папки в массив и смотрите в каждой, иначе может вылететь если большая вложенность папок(в Vista например) от переполнения стека рекурсией.
MaTBeu вне форума
Старый 05.08.2009, 05:48   #9
Flippp
Пользователь
 
Регистрация: 05.03.2009
Сообщений: 62
По умолчанию

Код:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
BOOL CSeeker::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, "\\");
					SetWindowText(window, next);
					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
		AddFileToList(file);
	}
	while (FindNextFile(hSearch, &wfd));	// next file in folder
	FindClose (hSearch);					// close search descriptor

	return TRUE;
}
вот так компилю и ошибки вылетают:
7 `CSeeker' has not been declared
40 `window' undeclared (first use this function)
60 `AddFileToList' undeclared (first use this function)
может я что-то не проинклудил?
Flippp вне форума
Старый 05.08.2009, 07:50   #10
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Нельзя бездумно переписывать примеры!
В данном случае вам привели реализацию метода seek некоего класса CSeeker. А т.к. этот класс у вас нигде не объявляется - выскакивает ошибка. Просто оформите этот метод как отдельную функцию. То же самое касается SetWindowText(window, next), у вас нет никаких окон, которым можно было бы задавать какой либо текст, замените это на просто вывод в консоль, например,
Код:
cout << next << endl;
Ну и наконец AddFileToList - это нестандартная функция, судя по всему добавляющая найденные файлы в некий список, разумеется эта функция у Вас нигде не объявлена, так же замените тут на простой вывод в консоль
Код:
cout << file << endl;
oleg kutkov вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить процент больших и маленьких букв ко всему тексту Kirra Паскаль, Turbo Pascal, PascalABC.NET 3 08.12.2011 05:46
Поиск файла Cpluser Общие вопросы C/C++ 4 03.03.2009 11:30
Этот сайт может нанести вред Вашему компьютеру - Что с Google? Levsha100 Свободное общение 12 01.02.2009 21:09
Поиск файла БД D-mon БД в Delphi 12 29.05.2008 13:26
Как подключиться к компьютеру (схема прилагается) Air Софт 6 08.05.2008 16:01