Консультация № 173878
01.11.2009, 13:12
0.00 руб.
0 9 1
Добрый день Уважаемые эксперты. У меня появилась довольно непонятная задача.
Пожалуйста помогите хоты бы шаблон написать как программу написать, с чего начать.
Пытался выполнять примеры, что даны в теории, не выходило. Компилятор Borland C++ Builder 6
Заранее благодарен.
Задание и теория в приложении.
Если с этого файлового обменика тяжело скачать подскажите другой, я загружу на него.


Приложение:
http://rapidshare.com/files/300844716/2.mht.html
ЗАДАНИЕ : Организовать поиск заданного файла в указанной директории и ее поддиректории.

Обсуждение

давно
Старший Модератор
17042
808
01.11.2009, 14:54
общий
Dimon4ik:
Напоминаю Вам о необходимости писать вопрос, а не загружать файлы, описывающие его суть, на файлообменники. Откорректируйте задание, в противном случае буду вынужден удалить Ваш вопрос в связи с его отсутствием.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
01.11.2009, 15:55
общий
Dimon4ik:
Воспользуйтесь WinAPI - FindFirstFile, FindNextFile
Неизвестный
01.11.2009, 16:03
общий
Dimon4ik:
Или у Вас какие-то особые требования? Пример на WinAPI могу написать.
Неизвестный
01.11.2009, 16:11
общий
Откоректировал вопрос.
Пожалуйста помогите Организовать поиск заданного файла в указанной директории и ее поддиректории средствами С++ и параметров командной строки.
Неизвестный
01.11.2009, 16:13
общий
Verena:
Было бы здорово. Только я не знаю что такое WinAPI. Но я разберусь.
Неизвестный
01.11.2009, 17:48
общий
это ответ
Здравствуйте, Dimon4ik.
С некоторыми усилиями написала пример в Borland-е (не люблю я его), у меня отрабатывает корректно. Я сделала поиск заданного файла в папке и всех её подпапках в глубину, если Вам нужно только первый уровень рассмотреть, просто уберите рекурсию или ограничьте её одним заходом. Для поиска по папке я воспользовалась WinAPI-функциями FindFirstFile, FindNextFile, FindClose.
Функция FindFirstFile создаёт описатель "поиск" (возвращаемое значение) и начинает поиск файлов и папок в заданной директории, соответствующих определённой маске. Продолжать поиск следует через функцию FindNextFile, которая работает с уже существующим описателем и возвращает bool-значение, показывающее, найдено ли ещё что-то в директории. После окончания поиска его следует закрыть функцией FindClose.
HANDLE FindFirstFile(
LPCTSTR lpFileName, //Директория для поиска и маска, по которой следует отбирать найденное
LPWIN32_FIND_DATA lpFindFileData //Информация о найденном файле/папке
);


BOOL FindNextFile(
HANDLE hFindFile, //Описатель, созданный FindFirstFile
LPWIN32_FIND_DATA lpFindFileData //Информация о найденном файле/папке
);


BOOL FindClose(
HANDLE hFindFile //Описатель, созданный FindFirstFile
);


lpFileName - здесь передаётся существующий путь и имя файла (или маска), т.е. после указания пути можно задать фильтр поиска при помощи символов '*' (любое количество любых символов) и '?' (один любой символ). Например, для поиска всех файлов можно задать маску *.* - любое имя файла с любым расширением (в данном случае фильтр также пройдут . и .. - указатели на родительскую и корневую директории).
lpFindFileData - указатель на структуру WIN32_FIND_DATA следующего вида:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //Аттрибуты файла
FILETIME ftCreationTime; //Время создания
FILETIME ftLastAccessTime; //Время последнего открытия
FILETIME ftLastWriteTime; //Время последней записи
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH]; //Имя файла
TCHAR cAlternateFileName[14]; //Альтернативное имя файла
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

Это возвращаемое значение, из этой структуры мы можем получить всю необходимую информацию о найденном файле или папке. К тому же, по первому полю этой структуры (dwFileAttributes) мы можем узнать, к примеру, файл или папку мы нашли.
Можно почитать об этом в MSDN: FindFirstFile, FindNextFile, FindClose.
Код в приложении, всё должно быть ясно из комментариев.
Удачи!
PS: WinAPI - грубо говоря, набор базовых функций для приложений под Windows.


Приложение:
//---------------------------------------------------------------------------

#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <vcl.h>
#pragma hdrstop

//---------------------------------------------------------------------------

bool g_bStop; //Флаг останова (можно и без него, но лучше подстраховаться)
char g_strInFolder [MAX_PATH], g_strSrchFileName[50]; //Папка и файл

void RecFind(char* pPath, WIN32_FIND_DATA fd) //Рекурсивная функция хождения по подпапкам
{
char* pPathRec=new char [MAX_PATH];
strcpy (pPathRec, pPath);
HANDLE hFindFile= FindFirstFile (strcat(pPathRec, "\\*"), &fd); //Вызываем поиск всех файлов и папок в заданной подпапке
BOOL bContinue=(hFindFile!= INVALID_HANDLE_VALUE); //Проверяем, запустилось ли
while (bContinue)
{
if(g_bStop) //Если рекурсия где-то прервалась, то и здесь выходим
{
FindClose(hFindFile); //Не забываем закрывать поиск
return;
}
if ((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0) //если не директория
{
if (strcmp (fd.cFileName, g_strSrchFileName)==0) { //Сравнимаем с именем файла
cout << "File is found: "; //Выводим сообщение
cout << pPath;
g_bStop = true; //Устанавливаем флаг остановки
return;
}
}
else //если же директория
{
if(fd.cFileName[0]!='.') //Если найдена не ссылка на текущую или верхнюю директорию
{
strcpy (pPathRec, pPath); //Вызываем рекурсию для директории
strcat (pPathRec, "\");
strcat (pPathRec, fd.cFileName);
RecFind(pPathRec,fd);
}
}
bContinue= FindNextFile(hFindFile, &fd); //Ищем следующий файл
}//while (bContinue)
delete [] pPathRec; //Чистим память
FindClose(hFindFile); //Закрываем поиск
}

#pragma argsused
int main(int argc, char* argv[])
{
g_bStop = false;
cin >> g_strInFolder;
cin >> g_strSrchFileName;
WIN32_FIND_DATA fd;
memset(&fd,0,sizeof(fd));
RecFind (g_strInFolder, fd);
getch();
return 0;
}
//---------------------------------------------------------------------------
5
Неизвестный
01.11.2009, 17:52
общий
Dimon4ik:
Обещанный пример написала, но не знаю, честно говоря, что подразумевается под "средствами С++" и "параметрами командной строки".
Неизвестный
01.11.2009, 18:11
общий
Verena:
Большое спасибо. Вы меня выручили, я постараюсь теперь понять.
Неизвестный
01.11.2009, 19:05
общий
Dimon4ik:
Всегда пожалуйста :)
Форма ответа