Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Borland C++ Builder (https://nowa.cc/forumdisplay.php?f=301)
-   -   Нужен поиск файлов в директории (https://nowa.cc/showthread.php?t=94728)

Мешок 08.05.2007 20:32

Нужен поиск файлов в директории
 
Здравствуйте! Мне нужно сообразить программку, которая ищет текстовые файлы в директории, в которых есть текст, указанный в строке для поиска. (Типа как в Windows поиск). Хоть намекните с чего начать.

Belkaw 11.05.2007 08:57

Re: Нужен поиск файлов в директории
 
Вроде бы это можно сделать с помощью API функции, FindFirstFileExA(), правда, сейчас не помню у неё входных параметров.

pluton 11.05.2007 21:59

Re: Нужен поиск файлов в директории
 
Цитата:

Сообщение от Мешок (Сообщение 931057)
Здравствуйте! Мне нужно сообразить программку, которая ищет текстовые файлы в директории, в которых есть текст, указанный в строке для поиска. (Типа как в Windows поиск). Хоть намекните с чего начать.

Начать с поиска файлов :)
Эта функция ищет первый файл в директории:
Код:

HANDLE FindFirstFile(
  LPCTSTR lpFileName,
  LPWIN32_FIND_DATA lpFindFileData
);

Следующие файлы по тем же критериям ищутся тут:
Код:

BOOL FindNextFile(
  HANDLE hFindFile,
  LPWIN32_FIND_DATA lpFindFileData
);

В конце поиска, нужно закрыть хендл поиска:
Код:

BOOL FindClose(
  HANDLE hFindFile
);


Вот пример юзания этих функций (из MSDN):
Код:

The following example calls FindFirstFile, FindNextFile, and FindClose to list the files in a specified directory.

Note that the only limitation on the number of files a directory can contain is the storage capacity of the disk.

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = INVALID_HANDLE_VALUE;
  char DirSpec[MAX_PATH];  // directory specification
  DWORD dwError;

  printf ("Target directory is %s.\n", argv[1]);
  strncpy (DirSpec, argv[1], strlen(argv[1])+1);
  strncat (DirSpec, "\\*", 3);

  hFind = FindFirstFile(DirSpec, &FindFileData);

  if (hFind == INVALID_HANDLE_VALUE)
  {
      printf ("Invalid file handle. Error is %u\n", GetLastError());
      return (-1);
  }
  else
  {
      printf ("First file name is %s\n", FindFileData.cFileName);
      while (FindNextFile(hFind, &FindFileData) != 0)
      {
        printf ("Next file name is %s\n", FindFileData.cFileName);
      }
   
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES)
      {
        printf ("FindNextFile error. Error is %u\n", dwError);
        return (-1);
      }
  }
  return (0);
}

Дальше: открываешь каждый найденный файл, и ищещь нужную строку. Можно попробовать с помошью функции
Код:

int __fastcall AnsiPos(const AnsiString& subStr) const;
Будут вопросы - пиши

donut 12.05.2007 09:17

Re: Нужен поиск файлов в директории
 
Цитата:

Сообщение от pluton (Сообщение 937909)
Дальше: открываешь каждый найденный файл, и ищещь нужную строку. Можно попробовать с помошью функции
Код:

int __fastcall AnsiPos(const AnsiString& subStr) const;

Это слишком медленный метод, который к тому же не работает с большими файлами. Лучше (быстрее) сделать поиск с использованием mmap.

pluton 12.05.2007 10:54

Re: Нужен поиск файлов в директории
 
Цитата:

Сообщение от donut (Сообщение 938558)
Это слишком медленный метод, который к тому же не работает с большими файлами. Лучше (быстрее) сделать поиск с использованием mmap.

Да, можешь сделать с помощью Memory Mapped Files. Все подробности по юзанию в MSDN

RanID 12.05.2007 12:22

Re: Нужен поиск файлов в директории
 
Добрый день.

Мне когда-то помогла статья связанная с поиском текста в файле
http://netcode.ru/cpp/?lang=&katID=3...D=30&artID=272

Мешок 12.05.2007 19:56

Re: Нужен поиск файлов в директории
 
Спасибо, ребята, я уже сделал. Совсем не так правда. Может и позорно, но я все равно не себе.
Делал с помощью DirectoryListBox, FileListBox из вкладки Win3.1 и Memo.

vlyakhovich 09.01.2008 10:31

Ответ: Нужен поиск файлов в директории
 
Попробуй через стандартные сишные функции findfirst, findnext

webprogect 22.05.2008 14:01

Ответ: Нужен поиск файлов в директории
 
HANDLE FindFirstFile(LPCTSTR lpFileName,
//имя файла(ов) который(е) ищем, можно использовать маску (*,?)
LPWIN32_FIND_DATA lpFindFileData //структура которая будет содержит информацию о файле);Если произошла ошибка, то функция вернет значение INVALID_HANDLE_VALUE, иначе handle поиска.Структура WIN32_FIND_DATA содержит следующие элементы:
dwFileAttributes – атрибуты файла(директории): FILE_ATTRIBUTE_ARCHIVE 0x00000020 файл или директория архивные FILE_ATTRIBUTE_COMPRESSED 0x00000800 файл или директория сжаты FILE_ATTRIBUTE_DIRECTORY 0x00000010 каталог FILE_ATTRIBUTE_ENCRYPTED 0x00000040 файл или директория зашифрованы FILE_ATTRIBUTE_HIDDEN 0x00000002 файл или директория скрыты FILE_ATTRIBUTE_NORMAL 0x00000080 файл или директория без атрибутов FILE_ATTRIBUTE_READONLY 0x00000001 только чтение FILE_ATTRIBUTE_SYSTEM 0x00000004 файл или директория системные FILE_ATTRIBUTE_TEMPORARY 0x00000100 файл или директория временные ftCreationTime – время создания ftLastAccessTime – время последнего открытия ftLastWriteTime – время последнего изменения nFileSizeLow – размер файла cFileName – имя файлаДля продолжения поиска необходима функция FindNextFile:BOOL FindNextFile( HANDLE hFindFile, //handle поискаLPWIN32_FIND_DATA lpFindFileData //указатель на структуру с информацией о файле);Если нет ошибок функция возвращает не нулевое значение. Для нахождения текущей директорииможно воспользоваться функцией GetCurrentDirectory:DWORD GetCurrentDirectory(DWORD nBufferLength, //размер буфераLPTSTR lpBuffer //указатель на буфер );Теперь сам код, используется Visual C++ 6.0, создаем Win32 Console Application.

#include <iostream.h>
#include <windows.h>
int main()
{
WIN32_FIND_DATA winFileData;
HANDLE hFile;
char szPath[MAX_PATH];
if(GetCurrentDirectory(sizeof(szPath),szPath))
{
cout<<szPath<<endl;
lstrcat(szPath,"\\*.*");
hFile = FindFirstFile(szPath,&winFileData);
if (hFile!=INVALID_HANDLE_VALUE)
{
do
{
cout<<winFileData.cFileName<<endl;
}
while (FindNextFile(hFile,&winFileData)!=0);
FindClose(hFile);
}
}
return 0;
}


Текущее время: 16:48. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2026 NoWa.cc

Время генерации страницы 0.02642 секунды с 9 запросами