Что такое код findfirst

Функция FindFirstFile

Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.

Чтобы определить дополнительные атрибуты, которые используются в поиске, используйте функцию FindFirstFileEx .

[in] Указатель на символьную строку с нулем в конце, которая определяет правильный каталог или путь и имя файла, которое может содержать символы подстановки ( * и ? ). Если символьная строка заканчивается символом подстановки, точкой или именем каталога, пользователь должен иметь доступ к корневому каталогу и всем вложенным в него каталогам на пути.

Windows NT/2000/XP: В версии ANSI этой функции, имя ограничено значением числа символов MAX_PATH . Чтобы выйти за пределы этого ограничения до длины 32 767 символов, вызовите Unicode версию этой функции и присоедините спереди пути «\\?\«. Подробную информацию см. в статье Именование файлов.

Windows 95/98/Me: Эта символьная строка не должна выходить за пределы количества символов значения MAX_PATH .

[out] Указатель на структуру WIN32_FIND_DATA, которая получает информацию о найденном файле или вложенном каталоге.

Если функция завершается успешно, возвращаемое значение — дескриптор поиска, используемый в последующем вызове функции FindNextFile или FindClose .

Если функция завершается ошибкой, возвращаемое значение — INVALID_HANDLE_VALUE . Чтобы получить дополнительные данные об ошибке, вызовите GetLastError .

Функция FindFirstFile открывает дескриптор поиска и возвращает информацию о первом файле, имя которого соответствует указанному образцу. Она ищет и длинные и короткие имена файла. После того, как дескриптор поиска был установлен, функция FindNextFile используется, чтобы искать другие файлы, которые соответствуют некоторому шаблону. Когда дескриптор поиска — больше не нужен, закройте его, используя функцию FindClose.

В редких случаях, информация об атрибутах файла файловой системы NTFS может быть не текущей, когда Вы вызываете эту функцию. Чтобы получить текущие атрибуты файла NTFS, вызовите функцию GetFileInformationByHandle .

Эта функция ищет файлы только по имени; она не может использоваться для поиска на основе атрибута.

Вы не можете использовать корневые каталоги как вводимую строку в параметре lpFileName для FindFirstFile, с или без заключительного обратного слэша (\). Чтобы проверить файлы в корневом каталоге, используйте что то подобное «C:\* » и пройдитесь по всему каталогу при помощи функции FindNextFile. Чтобы получить атрибуты корневого каталога, используйте функцию GetFileAttributes . Присоединенная спереди символьная строка «\\?\ » не дает доступ к корневому каталогу.

Точно так же в сетевом ресурсе Вы можете использовать для параметра lpFileName форму «\\server\service\*«, но нельзя использовать lpFileName, который указывает на ресурс непосредственно, типа «\\server\service«.

Чтобы исследовать какой-либо каталог, а не корневой каталог, используйте соответствующий путь к этому каталогу без завершающего обратного слэша (\). Например, аргумент «C:\windows» возвратит информацию о каталоге «C:\windows«, а не о каком-либо каталоге или файле в «C:\windows«. Попытка открыть поиск с конечным обратным слэшем (\) будет всегда завершаться ошибкой.

Отдавайте себе отчет в том, что кто — то может создать или удалить этот файл в промежутке времени, когда Вы сделали запрос о результатах поиска и когда получили ответную информацию. Поэтому, если Вы надумали создать файл, лучше использовать функцию CreateFile с CREATE_NEW (сбой, если файл существует) или OPEN_EXISTING (сбой, если файл не существует).

Нижеследующий код показывает минимальное использование функции FindFirstFile.

Другой пример, см. в статье Список файлов в каталоге .

Размещение и совместимость FindFirstFile

findfirst, findnext

int findnext( struct ffblk *ptr)

Необходимо вклю­чить фaйл dos.h, который содержит макросы, используемые в качестве значения параметра attrib. Эти функции не определены стандартом ANSI С. Функция findfirst() ищет первое имя файла, соответствующее образцу поиска, на который ука­зывает параметр fname. Имя файла может включать в себя диск и путь. Также имя файла может включать в себя шаблоны поиска * и ?. При нахождении подходящего файла структура, на кото­рую указывает ptr, заполняется информацией об этом файле.

Структура ffblk определена для DOS следующим образом:

Илон Маск рекомендует:  Функции даты и времени

Структура ffblk определена для Windows следующим образом:

Параметр attrib определяет тип файлов, которые необходимо найти с помощью функции findfirst(). Если attrib имеет значение 0, то допустимыми являются все файлы, подходящие под шаблон поиска. Для того, чтобы обеспечить более селективный поиск, параметр attrib может при­нимать одно из значений, определяемых следующими макросами:

Макрос Значение
FA_RDONLY Файл только для чтения
FA_HIDDEN Скрытый файл
FA_SYSTEM Системный файл
FA_LABEL Метка тома
FA_DIREC Подкаталог
FA_ARCH Архивный файл

Функция findnext() продолжает поиск, начатый функцией findfirst().

Обе функции findfirst() и findnext() в случае успеха возвращают 0. В случае неудачи возвраща­ется — 1, а переменная errno устанавливается равной ENOENT (имя файла не найдено). Перемен­ная _doserrno устанавливается равной либо ENMFILE (нет больше файлов в каталоге), либо ENOENT.

Delphi-Help

FindFirst

FindFirst

Описание

function FindFirst ( const FileMask : string; Attributes : Integer; var SearchResult : TSearchRec ) : Integer;

Функция FindFirst ищет файлы, соответствующие FileMask и Attributes, возвращая первое соответствие (если найдено) в SearchResult.
Attributes определяют файлы, для поиска в дополнение к правильным файлам.
Если соответствие найдено, то возвращаемое значение — 0, иначе, оно отрицательное (и запись не заполняется).
FileMask может содержать путь, так же как имя файла. Имя файла может содержать символы — шаблоны:
?: Соответствие любого одного символа *: Соответствие 0, 1 или более символов
Attributes могут быть установлены следующим образом:
faAnyFile: Любой файл
faReadOnly: Файлы nолько для чтения
faHidden: Скрытые файлы
faSysFile: Системные файлы
faVolumeID: файлы идентификатора объема
faDirectory: Файлы каталоги
faArchive: Архивные файлы
Вы можете установить один или более из вышеупомянутых атрибутов, связывая их.
Запись SearchResult включает много полей. Некоторые используются последующими запросами к FindNext. Другие доступны вашей программе:
Name: Из длинного названия найденного файла
Size: Размер файла в байтах
Time: Дата/время последнего изменения файла
Attr: атрибуты файла (как выше)

Пример кода

Пример кода : Ищем все подходящие под Unit1.d* файлы в текущем каталоге

var
searchResult : TSearchRec;
begin
// Пытаемся найти правильные файлы, соответствующие Unit1.d* в текущем каталоге
if FindFirst (‘Unit1.d*’, faAnyFile, searchResult) = 0 then
begin
repeat
ShowMessage(Имя файла = ‘+searchResult.Name);
ShowMessage(‘Размер файла = ‘+IntToStr(searchResult.Size));
until FindNext(searchResult) <> 0;
// Должен освободить ресурсы, используемые этими успешными, поисками
FindClose(searchResult);
end;
end;

Имя файла = Unit1.dcu
Размер файла = 4382
Имя файла = Uni1.dfm
Размер файла = 524
Имя файла = Uni1.ddp
Размер файла = 51

Пример кода : Ищем все каталоги выше, включая текущий

var
searchResult : TSearchRec;

begin
// Пробуем найти каталоги выше текущего каталога
SetCurrentDir(‘..’);
if FindFirst (‘*’, faDirectory, searchResult) = 0 then
begin
repeat
// Показываем только каталоги
if (searchResult.attr and faDirectory) = faDirectory
then ShowMessage(‘Directory = ‘+searchResult.Name);
until FindNext(searchResult) <> 0;
// Должен освободить ресурсы, используемые этими успешными, поисками
FindClose(searchResult);
end;
end;

Directory = .
Directory = ..
Directory = Bin
Directory = Help
Directory = Projects
Directory = Demos
Directory = Lib
Directory = Objrepos
Directory = MergeModules
Directory = Imports
Directory = Source
Directory = Rave5
Directory = Ocx

Примечание

Предупреждение : Вы должны вызвать FindClose после успешного FindFirst, когда Вы закончили искать. Это освобождает ресурсы, взятые процессом поиска.
Если FileMask не содержит никакой информации пути, то поиск будет проводится в текущем каталоге.
Поскольку параметр Attributes определяет дополнительные типа файлов для поиска, Вы должны фильтровать результаты Attr значение, чтобы выбрать только желательные типы файлов.

Функции и процедуры Delphi. Справочник.

Функция FindFirst(
const Path: string;
Attr: Integer;
var F: TSearchRec ): Integer;

Описание
Функция находит файл с набором атрибутов Attr в каталоге и по маске, определенных константой Path. Найденное имя файла записывается в переменную F. Если указанный файл найден, то функция возвращает 0, иначе возвращается код ошибки Windows. Параметр Attr — комбинация нескольких констант атрибутов файла или их значений. Константа Path представляет собой полный путь с маской файла (например, ‘C:\MYDIR\*.ini’ ). Повторный поиск файла производится с помощью функции FindNext. По окончанию поиска необходимо высвободить память, выделенную при вызове функции FindFirst, с помощью процедуры FindClose.

Значения констант атрибутов файла:

Константа Значение Описание
faReadOnly $00000001 Только чтение
faHidden $00000002 Скрытый файл
faSysFile $00000004 Системный файл
faVolumeID $00000008 Идентификатор тома
faDirectory $00000010 Каталог
faArchive $00000020 Архивный файл
faAnyFile $0000003F Произвольный файл
Илон Маск рекомендует:  Синтаксис css2 и основные типы данных

Пример
Данный пример выводит список всех файлов в каталоге ‘C:\WINDOWS\’, имеющих атрибуты «Системный» и «Скрытый».
var

if FindFirst(‘C:\WINDOWS\*.txt’, faH >

Что такое код findfirst

Группа: Участник
Сообщений: 55

Всем привет!
Зае..ся ваще, что за глюк?
Вот код:
TSearchRec sr;
if (FindFirst(InputDir + «\*.*», faAnyFile, sr) == 0)
<
do
<
if ((sr.Name != «.»)&&(sr.Name != «..»))
<
if (sr.Attr == faDirectory)
<
Utf8Encode(InputDir + «\» + sr.Name);
>
if ((sr.Attr != faDirectory)&&(sr.Attr != faVolume > <
TStringList * MyList = new TStringList;
Form1->StatusBar1->Panels->Items[0]->Text = InputDir + «\» + sr.Name;
Form1->StatusBar1->Panels->Items[2]->Text = Form1->StatusBar1->Panels->Items[2]->Text.ToInt() + 1;
Form1->Memo1->Lines->Add(InputDir + «\» + sr.Name);
>
>
> while (FindNext(sr) == 0);
FindClose(sr);
>

Почему этот алгоритм, точнее функции распознают папки у кот. настроен внешний вид за ФАЙЛЫ. _NIK_

Отправлено: 03.03.2006, 22:34

Группа: Участник
Сообщений: 55

Косые Черточки ДВОЙНЫЕ, тока почему-то здесь отображаются одинарные! _NIK_
Отправлено: 04.03.2006, 17:47

Группа: Участник
Сообщений: 55

Пробовал. им ваще пофиг какой параметр attr в функции FindFirst и так тож не катит.
Остановился на проверке DirectoryExists(), и рекурсии в блоке:
TStringList * MyList = new TStringList;
Form1->StatusBar1->Panels->Items[0]->Text = InputDir + «\» + sr.Name;
Form1->StatusBar1->Panels->Items[2]->Text = Form1->StatusBar1->Panels->Items[2]->Text.ToInt() + 1;
Form1->Memo1->Lines->Add(InputDir + «\» + sr.Name);
условие убрал поставил else — работает

Отредактировано _NIK_ — 04/03/2006, 17:47 QUOTE Почему этот алгоритм, точнее функции распознают папки у кот. настроен внешний вид за ФАЙЛЫ.

if (sr.Attr == faDirectory)

Как писал гость

CODE
Attributes can be combined by or-ing their constants or values.

Это условие может не выполняться если каталог не имеет атрибут исключительно faDirectory
Во втором условии то же небходимо использовать сравнение после маскирования. Guest

Отправлено: 06.03.2006, 15:19
QUOTE
Оказывается в файловой системе в каждом каталоге присутствуют каталоги с именами
«.»
«..»
Пришлось предусмотреть условие, чтобы их пропустить.
Зачем эти каталоги нужны ?

Для однообразия и упрощения переходов по дереву каталогов
«.» — означает текущий каталог и ссылается на себя
«..» — означает «шаг назад» и ссылается на родителя QUOTE (Guest @ 06/03/2006, 15:19)

QUOTE
Оказывается в файловой системе в каждом каталоге присутствуют каталоги с именами
«.»
«..»
Пришлось предусмотреть условие, чтобы их пропустить.
Зачем эти каталоги нужны ?

Для однообразия и упрощения переходов по дереву каталогов
«.» — означает текущий каталог и ссылается на себя
«..» — означает «шаг назад» и ссылается на родителя

Прикольно у меня получилось, когда я не делал проверку на «.» и «..» в рекурсии получался бесконечный цикл Grigoriy

Отправлено: 06.03.2006, 18:09

Группа: Участник
Сообщений: 381

QUOTE (Guest @ 06/03/2006, 15:19)
Для однообразия и упрощения переходов по дереву каталогов
«.» — означает текущий каталог и ссылается на себя
«..» — означает «шаг назад» и ссылается на родителя

Во спасибо. QUOTE А я не пользуюсь рекурсионными вызовами при просмотре каталогов. Всё делает одна простая функция. Случай был один .

А какая разница рекурсивная или нет если дерево «закольцовано»? Для такого случая можно пользоваться максимальной глубиной вложенности: предел превышен — кольцо. Или анализировать весь пройденный путь, можно поробовать сыграть значениях полей TSearchRec. QUOTE (Doga @ 06/03/2006, 17:52) А я не пользуюсь рекурсионными вызовами при просмотре каталогов. Всё делает одна простая функция. Случай был один. Одно чучело на компе которого стояла наша прога, каким то образом умудрилось скопировать несколько каталогов на диске в них же самих, пока ситема позволяла. Так вот, во время сканирования тех каталогов периодически вылетал «StackOverflow» и только на том компе. В коде разбирался долго и ничего не нашёл. А когда выяснилось, все просто попадали состульев , но меры приняли, о чём собственно я и сказал выше.

А какой функцией пользуешься? QUOTE (Guest @ 06/03/2006, 18:24)

QUOTE
А я не пользуюсь рекурсионными вызовами при просмотре каталогов. Всё делает одна простая функция. Случай был один .

А какая разница рекурсивная или нет если дерево «закольцовано»? Для такого случая можно пользоваться максимальной глубиной вложенности: предел превышен — кольцо. Или анализировать весь пройденный путь, можно поробовать сыграть значениях полей TSearchRec.

Как понять «дерево закольцовано»?
И предел вложенности нельзя использовать — не все файлы найдет! CODE //—————————————————————————
void __fastcall TMonitorThread::Execute()
<
//—- Place thread code here —-
int i,j,k;
TSearchRec sr;
AnsiString MaskNameString;

if(FPathList)
<
if ( FPathList->Count > 0 )
<
//А может пути неверныя?
for (int i = 0; i Count; i++)
<
if (!DirectoryExists(FPathList->Strings[i]))
<
FPathList->Delete(i);
i—;
>
>

//А таперя — поиск всех доступных путёв на всех доступных дисках во всех даступных путях!
for (i = 0; i Count; i++)
<
if (Terminated)
<
break;
>

//Корректировка пути(дабавлямс ‘\’)
FPathList->Strings[i] = NormalDir(FPathList->Strings[i]);

//А ща MaskNameString — енто будет строка с маской имени файла(вааще-то каталога)
MaskNameString = FPathList->Strings[i] + «*.*»;
//Поиск всех подкаталогов в выбраном каталоге
for ( j = 0;;j++) //здесь лучша использовать while, но мне был нужен счётчик j
<
if (Terminated)
<
break;
>

if (!j)
<
if (FindFirst(MaskNameString, faAnyFile, sr))
<
FindClose(sr);
break;
>
>
else
<
if (FindNext(sr))
<
FindClose(sr);
break;
>
>

System.SysUtils.FindFirst

Contents

Properties

Description

Searches for the first instance of a file name with a given set of attributes in a specified directory.

FindFirst searches the directory specified by Path for the first file that matches the file name implied by Path and the attributes specified by the Attr parameter. The result is returned in the F parameter. Use the fields of this search record to extract the needed information. FindFirst returns 0 if a file was successfully located, otherwise, it returns an error code.

The Path constant parameter is the directory and file name mask, including wildcard characters. For example, ‘.\test\*.*’ specifies all files in the test subdirectory (on Windows).

The Attr parameter specifies the special files to include in addition to all normal files. Choose from these file attribute constants when specifying the Attr parameter.

Илон Маск рекомендует:  Функции sybase
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Type Visibility Source Unit Parent
function public