FindClose — Функция Delphi


Функция FindClose

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

[in/out] Дескриптор поиска.

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

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

После того, как вызовется функция FindClose, дескриптор, указанный параметром hFindFile не может использоваться в последующих вызовах ни функцией FindNextFile, FindNextStreamW,ни функцией FindClose.

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

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

FindClose в delphi

Я был свидетелем программы Delphi 6, которая использует FindFirst() от SysUtils внутри функции. Это программа, которая работает в течение нескольких месяцев и выполняет эту операцию сотни раз. Удивительно, что FindClose() не называется и ничего плохого не происходит.

Если я правильно понимаю, программа, похоже, теряет файлы. (В записи TSearchRec есть запись THandle . Вся запись отбрасывается, а THandle не закрывается). Дело в том, что, похоже, проблем нет. Я использовал обработчик процесса sysinternal и не наблюдал открытого дескриптора файла в файле, найденном FindFirst .

Как описано, ваша программа протекает. Если вы вызываете FindFirst без последующего вызова FindClose , вы будете обращаться за ошибками. Сделайте это достаточно, и программа исчерпает доступные объекты дескриптора и сработает.

Что вы не видите, это говорит о том, что вы еще не достигли предела. То, что вы не наблюдаете утечку из Process Explorer, говорит о том, что вы не смотрите на правильную информацию. Или, возможно, вы полностью поставили диагноз проблемы, и либо код, который протекает, не вызван, либо вызван вызов FindClose , но вы еще не нашли его.

Вместо того, чтобы тратить гораздо больше времени на анализ этого, вы должны исправить свой код. Суть в том, что если вы не отвечаете на вызовы FindFirst с вызовами FindClose , ваша программа течет.

FindClose — Функция Delphi

Здравствуйте, ArtDenis, Вы писали:

AD>. и ещё в догонку: FindClose нужно делать только в том случае, если по был найден хотя-бы один объект. Если ничего не найдено, то FindClose делать не надо.

Для разнообразия читаем канон:

То, что Борланд, как ему свойственно, пытается утереть сопли за своими пользователями — имхо не повод писать код, который может в любой версии перестать работать.

От: ArtDenis
Дата: 07.07.04 16:04
Оценка: 6 (1)

Здравствуйте, Softwarer, Вы писали:

S>Для разнообразия читаем канон:
S>.

Ничего подобного. Приведённый текст совершенно неверен. FindClose нужно делать только в том случае, если FindFirst вернул 0. Причём невыполнение этого правила может грозить крахом программы. Моё личное мнение, что это — недокументированный баг VCL. Вполне возможно, что в vcl6 он исправлен, но в более старых версиях он давал о себе знать.

PS: внимательно смотрите примеры к функциям в хелпе. Они написаны с обходом этого бага.

От: Slicer [Mirkwood] https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 07.07.04 16:35
Оценка:

FindFirstFile
Return Values
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.

Remarks
The FindFirstFile function opens a search handle and returns information about the first file whose name matches the specified pattern. It searches both the long and short file names. After the search handle has been established, use the FindNextFile function to search for other files that match the same pattern. When the search handle is no longer needed, close it by using the FindClose function.

Note: FindFirst allocates resources (memory) which must be released by calling FindClose

И ни слова о том, всегда ли эти ресурсы выделяются. А уж в приведенной Softwarer цитате ясно сказано, что всегда

От: akasoft
Дата: 07.07.04 17:02
Оценка: 58 (3) +1

Здравствуйте, ArtDenis, Вы писали:

Ну я прям не знаю.

С тех пор, как научился делать Ctrl + Left Click я разучился думать, и считаю эту комбинацию самой важной в Дельфи.

Давайте ещё раз. На основе исходников D7 (хотя Softwarer справедливо подлавливал меня уже на D6 и D5).

Жмём в SysUtils, отбрасывая блоки кода для Linux, видим

Ну и для порядка это:

Если ещё не очевидно, задаёмся вопросом, «а что будет, если мы всё же последуем рекомендации, данной здесь

Ответ: ждут, конечно. Но не по этому поводу.

Выделение жирным моё.

AD>PS: внимательно смотрите примеры к функциям в хелпе. Они написаны с обходом этого бага.

Мораль сей басни: Жмите Ctrl+ Left Click, и будете вооружены знанием. Али хелпов никогда не писали?

Послесловие: не удивлюсь, если Softwarer снова откапает что-то «не то» в своём D6.

От: ArtDenis
Дата: 07.07.04 17:35
Оценка: 58 (3)

A>Выделение жирным моё.

Всё правильно. В приведённом тобой примере этого бага нет. Поэтому я решил заглянуть исходники более ранних версий VCL, в данном случае 4-ой. И что-же мы там видим:

Как говориться, найди десять (в нашем случае одно) отличий

Вывод такой: в ранних версиях VCL FindClose для случая, когда ни один файл не найден грозит крахом программы, т.к. два раза будет вызыван Windows.FindClose(F.FindHandle); Правда, ничего серьёзного может и не произойти, но это будет на совести ОС

В VCL, начиная с 5-ой (или 6-ой), пусть меня поправят, вызов FindClose при неудачной попытке поиска совершенно безопасен.

От: akasoft
Дата: 08.07.04 05:27
Оценка:

Здравствуйте, ArtDenis, Вы писали:

AD>Как говориться, найди десять (в нашем случае одно) отличий

Ну, что я говорил.

Послесловие: не удивлюсь, если Softwarer снова откапает что-то «не то» в своём D6.

Оч. хорошо, что ты тоже не брезгуешь поковыряться в исходниках.

А ещё можно заметить, что VCL развивается и улучшается от версии к версии. Хотя, наверное, правильно будет теперь использовать прошедшее время.

От: ArtDenis
Дата: 08.07.04 07:11
Оценка:

Здравствуйте, akasoft, Вы писали:

A>Оч. хорошо, что ты тоже не брезгуешь поковыряться в исходниках.

Я то как раз, брезгую, но жизнь заставляет

От: Softwarer http://softwarer.ru
Дата: 08.07.04 07:48
Оценка:

Здравствуйте, ArtDenis, Вы писали:

AD>Всё правильно. В приведённом тобой примере этого бага нет. Поэтому я решил заглянуть исходники более ранних версий VCL, в данном случае 4-ой. И что-же мы там видим:

У меня нет четверки (это вообще на редкость глючная версия, между прочим), поэтому спрошу: а FindFirst там пытается сделать FindClose? Если нет — все правильно; а именно что на уровне пятерки или шестерки (в шестерке все уже как написал akasoft) борландеры решили подтирать сопли за теми, кто не делает FindClose после неудачного FindFirst.

AD>Вывод такой: в ранних версиях VCL FindClose для случая, когда ни один файл не найден грозит крахом программы, т.к. два раза будет вызыван Windows.FindClose(F.FindHandle); Правда, ничего серьёзного может и не произойти, но это будет на совести ОС

Скорее всего, конечно, не произойдет ничего кроме взведения LastError. В остальном согласен; VCL, к сожалению, не свободна от ошибок, и она могла быть и здесь.

В то же время я считаю, что «по умолчанию» надо писать согласно документации. Если найдена ошибка — писать обход ошибки с соответствующими комментариями; просто так писать код, который станет работать неправильно в случае исправления ошибки VCL — имхо, некорректно. Само собой, надо также смотреть, было ли такое утверждение (о необходимости FindClose) в четверке.

От: ArtDenis
Дата: 08.07.04 08:46
Оценка:

Здравствуйте, Softwarer, Вы писали:

S> У меня нет четверки (это вообще на редкость глючная версия, между
S> прочим), поэтому спрошу: а FindFirst там пытается сделать FindClose?

Да. Вот код этой ф-ции:

S> Скорее всего, конечно, не произойдет ничего кроме взведения LastError. В
S> остальном согласен; VCL, к сожалению, не свободна от ошибок, и она могла
S> быть и здесь.
К сожалению, мой опыт говорит, что приложения после этого падают. Причём не обязательно в этом месте. Симптомы в даном случае такие-же, как при записи за пределы блока памяти.

S> В то же время я считаю, что «по умолчанию» надо писать согласно
S> документации. Если найдена ошибка — писать обход ошибки с
S> соответствующими комментариями; просто так писать код, который станет
S> работать неправильно в случае исправления ошибки VCL — имхо,
S> некорректно. Само собой, надо также смотреть, было ли такое утверждение
S> (о необходимости FindClose) в четверке.
Да, есть Вот пример из комментариев исходников:

И, кстати, код из хелпа:


СНП Артёмов Денис. E-mail: artden(на)ufacom(точка)ru

От: Slicer [Mirkwood] https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 08.07.04 09:17
Оценка:

S>Если нет — все правильно; а именно что на уровне пятерки или шестерки (в шестерке все уже как написал akasoft) борландеры решили подтирать сопли за теми, кто не делает FindClose после неудачного FindFirst.
Так после неудачи это, думаю, и не нужно было никогда — и в четверке тоже, если только они там не выделяли сами еще что-то в начале поиска, без чего вполне можно обойтись. Потому что WinAPI-основа этого, как я уже указал, не требует.

S>В то же время я считаю, что «по умолчанию» надо писать согласно документации.
Так фишка как раз в том, что в хелпе по FindFirst написано одно, а в примере (из хелпа!) к тому же самому FindFirst — прямо противоположное!

Процедуры и функции для работы с файлами в Delphi

Читайте также:

  1. Cущность банковского процента, его функции и роль.
  2. I. Функции времени в спутниковых технологиях.
  3. I. Экстремумы функции двух переменных
  4. II. Основные направления социально-медицинской работы с семьями детей ограниченными возможностями
  5. III. Лекционный материал по теме: ПРАВИЛА РАБОТЫ НА ЛЕКЦИИ
  6. IV. Функции
  7. IX. Лекционный материал: ОРГАНИЗАЦИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
  8. N В условиях интенсивной мышечной работы, при гипоксии (например, интенсивный бег на 200м в течении 30 с) распад углеводов временно протекает в анаэробных условиях
  9. N Выполняет функции гормона
  10. N Особенности структуры и функции обуславливают особенности в метаболизме клеток
  11. TCR. Функции Т-лимфоцитов
  12. VIII. Принципы работы вычислительной системы

Основные процедуры и функции:

Процедура: AssignFile(var Vf; FileName: string);Модуль: System

Описание: Процедура устанавливает ассоциативную связь между файловой переменной Vf и внешним файлом, имя которого определено параметром FileName. Все операции, производимые с файловой переменной, будут производиться со связанным с ней файлом. FileName — выражение типа string или PChar (если допускается расширенный синтаксис). Если в качестве имени файла указать пустую строку, то файловая переменная будет ассоциирована со стандартным файлом ввода (когда после AssignFile следует процедура Reset) или вывода (когда после следует процедура Rewrite).

Пример:
var Vf : file of Integer;
begin
.
AssignFile(Vf,'work.dat'); //инициализирует файловую переменную
Rewrite(Vf); //создает файл 'work.dat'
CloseFile(Vf); //закрывает файл
.
end;

Процедура: BlockRead(var Vf: file; var Buf; Count: Integer [;var AmtTransferred: Integer]); Модуль: System

Описание: Процедура читает одну или большее количество записей из открытого файла, связанного с файловой переменной Vf, в переменную Buf. Параметр Count определяет количество записей, которое необходимо прочитать из файла. В параметре AmtTransferred возвращается фактическое количество прочитанных записей, которое может быть меньше Count (например, когда размер последнего блока данных в файле меньше заданного размера записи). Максимальный размер прочитанного блока равен Count*RecSize байт. RecSize — размер записи, определенный, во время открытия файла (если размер записи не был задан, то используется значение по умолчанию — 128 байт). Параметр AmtTransferred является необязательным. Но если данный параметр опущен, а количество прочитанных записей меньше Count, то возникнет ошибка ввода/вывода (исключение EInOutError).

Пример:
var
Vf1, Vf2: file; NRead, NWrite: Integer;
Buf: array[1..1024] of Char;
begin
AssignFile(Vf1, 'read.txt');
Reset(Vf1, 1); //Устан-ет размер записи входного файла = 1
AssignFile(Vf2, 'write.txt');
Rewrite(Vf2, 1); //Устан-ет размер записи выходного файла = 1
repeat
BlockRead(Vf1, Buf, SizeOf(Buf), NRead); //читает данные
BlockWrite(Vf2, Buf, NRead, NWrite); //записывает данные
until (NRead = 0) or (NWrite <> NRead);
CloseFile(Vf1);
CloseFile(Vf2);
end;

Процедура: BlockWrite(var Vf: file; var Buf, Count: Integer [;var AmtTransferred: Integer]); Модуль: System

Описание: Процедура записывает одну или несколько записей из переменной Buf во внешний файл, связанный с файловой переменной Vf. Параметр Count определяет количество записей, которое необходимо записать в файл. В параметре AmtTransferred возвращается фактическое количество скопированных записей, которое может быть меньше Count (например, когда место на диске закончилось до окончания записи в файл). Максимальный размер записываемого блока равен Count*RecSize байт, где RecSize — размер записи, определенный, во время открытия файла или 128 байт, если размер записи не был определен. Параметр AmtTransferred является необязательным. Но если данный параметр опущен, и количество прочитанных записей будет меньше Count, то возникнет ошибка ввода/вывода (исключение EinOutError).

Пример:
var
Vf1, Vf2: file;
NRead, NWrite: Integer;
Buf: array[1..1024] of Char;
begin
AssignFile(Vf1, 'read.txt');
Reset(Vf1, 1); //Устан-ет размер записи входного файла = 1
AssignFile(Vf2, 'write.txt');
Rewrite(Vf2, 1); //Устан-ет размер записи выходного файла = 1
repeat
BlockRead(Vf1, Buf, SizeOf(Buf), NRead); //читает данные
BlockWrite(Vf2, Buf, NRead, NWrite); //записывает данные
until (NRead = 0) or (NWrite <> NRead);
CloseFile(Vf1);
CloseFile(Vf2);
end;

Процедура: CloseFile(var Vf); Модуль: System

Описание: Процедура разрывает ассоциативную связь между файловой переменной и внешним файлом, при этом, файл обновляется и закрывается. Механизм обработки ошибок ввода/вывода с помощью обработчиков исключений включается директивой компилятора <$I+>. При использовании директивы <$I->информацию об ошибках можно получить с помощью функции IOResult.

Пример:
var
Vf: file of Integer;
begin
.
AssignFile(Vf, 'work.dat'); //инициализирует файловую переменную
Rewrite(Vf); //создает файл 'work.dat'
CloseFile(Vf); //закрывает файл
.
end;

Процедура: Erase(Var Vf); Модуль: System

Описание: Удаляет файл, связанный с файловой переменной Vf. Vf — файловая переменная, ассоциированная с файлом любого типа. Перед удалением файл необходимо закрыть процедурой CloseFile.

Пример:
var
Vf: file;
begin
AssignFile(Vf, 'C:\WINDOWS\TEMP\tmpfile.tmp');
Rewrite(Vf); //создает временный файл 'tmpfile.tmp'
.
CloseFile(Vf); //закрывает файл
Erase(Vf); //удаляет файл
end;

Процедура: FindClose(var F: TSearchRec); Модуль: SysUtils

Описание: Процедура завершает последовательность вызовов функций FindFirst — FindNext и высвобождает память, выделенную при вызове функции FindFirst.

Процедура: Read(Vf, V1 [, V2, . Vn ]); Модуль: System

Описание: Процедура читает информацию из файла, ассоциированного с файловой переменной Vf, в переменную(ые) Vn.

Типизированные файлы. Читает запись (компонент) из файла в переменную. Файлы строкового типа. Читает все символы до маркера конца строки, не включая его или пока значение Eof(Vf) не будет равно True. Если размер прочитанной строки больше, чем размер строковой переменной, то строка усекается. После прочтения строки, каждый последующий вызов данной процедуры будет возвращать пустую строку, т.к. процедура Read не переводит указатель на новую строку. Если необходимо прочитать более одной записи из файла, то используйте процедуру ReadLn. Файлы символьного типа. Читает символ из файла. Если достигнут конец файла (т.е. Eof(Vf)=True), то процедура возвращает символ ‘Ctrl+Z’ (ASCII код 26).

Файлы целочисленных и действительных типов. Если тип переменной соответствует формату числовой строки, то переменной присваивается прочитанное значение, иначе возникает ошибка ввода/вывода.

Пример:
var
Vf1,Vf2: TextFile;
FileName1, FileName2: string;
C: Char;
begin
FileName1:='read.txt'; //подразумевается, что файл существует
FileName2:='write.txt';
AssignFile(Vf1, FileName1);
Reset(Vf1); //открывает файл 'read.txt'
AssignFile(Vf2, FileName2);
Rewrite(Vf2); //создает файл 'write.txt'
while not Eof(Vf1) do //повтор, пока не достигнут конец файла
begin
Read(Vf1, C); //читает символ из файла 'read.txt'
Write(Vf2, C); //записывает символ в файл 'write.txt'
end;
CloseFile(Vf2);
CloseFile(Vf1);
end;

Процедура: Rename(var Vf; NewName); Модуль: System

Описание: Процедура переименовывает файл, связанный с файловой переменной Vf. Новое имя файла указывается в параметре NewName. NewName — переменная типа string или PChar (если допускается расширенный синтаксис). После выполнения данной процедуры все операции c файловой переменной Vf будут производиться над переименованным файлом.

Процедура: Reset(var Vf: File [;RecSize: Word]); Модуль: System

Описание: Процедура открывает существующий файл и устанавливает указатель в начало файла. Vf — файловая переменная, ассоциированная с файлом любого типа при помощи процедуры AssignFile. RecSize — необязательный параметр, указывающий размер записи файла. Когда параметр RecSize опущен, размер записи принимается по умолчанию 128 байт. Если файл, связанный с файловой переменной Vf, не существует, то при вызове процедуры Reset возникнет ошибка. Если файл уже открыт, то при вызове данной процедуры он сначала закрывается, а затем снова открывается. Если с файловой переменной Vf связан текстовый файл, то он открывается только для чтения.

Процедура: Rewrite(var Vf: File [; Recsize: Word]); Модуль: System

Описание: Процедура создает новый файл и открывает его. Параметр Vf определяет файловую переменную, связанную с любым типом файлов при помощи процедуры AssignFile. RecSize — необязательный параметр, указывающий размер записи файла. Когда параметр RecSize опущен, размер записи принимается по умолчанию 128 байт. Если файл с заданным именем уже существует, то процедура удаляет старый файл и создает новый пустой файл. Если файл существует и открыт, то функция перед удалением старого файла сначала закрывает его. Если файловая переменная Vf связана с текстовым файлом, то он открывается только для записи. После вызова данной процедуры Eof(Vf)=True.

Илон Маск рекомендует:  Как запретить перенос текста

Процедура: Seek(var Vf; N: Longint); Модуль: System

Описание: Устанавливает файловый указатель в заданную позицию файла. Параметр Vf представляет собой файловую переменную, ассоциированную с типизированным или нетипизированным файлом. Для успешного выполнения процедуры файл должен быть открыт. Индекс позиции, в которую будет установлен указатель, определяется параметром N. Первая позиция в файле имеет индекс 0. Если необходимо добавить данные в конец файла, то поставить указатель в конец файла Vf можно следующим образом: Seek(Vf, FileSize(Vf)).

Процедура: Truncate(var Vf); Модуль: System

Описание: Процедура удаляет все записи в файле, находящиеся после текущей позиции (текущая позиция становится концом файла). Параметр Vf представляет собой файловую переменную, связанную с файлом любого типа, кроме текстовых (данная процедура не работает с текстовыми файлами). При вызове процедуры файл должен быть открыт.

Процедура: Write(Vf, V1. Vn); (для типизированных файлов) Модуль: System

Описание: Процедура записывает данные в типизированный файл. Параметр Vf представляет собой файловую переменную, связанную с типизированным файлом. Тип переменных V1 . Vn должен соответствовать типу фала. При записи в файл очередного компонента, указатель текущей позиции файла передвигается на следующий компонент. Если перед вызовом данной процедуры указатель стоит в конце файла (Eof(Vf)=True), то записываемые данные будут добавлены в конец файла (размер файла соответственно увеличится).

Функция: DeleteFile(const FileName: string): Boolean; Модуль: SysUtils

Описание: Функция удаляет файл с диска. При успешном выполнении возвращает True, а если файл не существует, или не может быть удален, то — False.

Пример:
var
FileName: string;
begin
.
if DeleteFile(FileName) then
MessageDlg('Файла успешно удален', mtInformation, [mbOk], 0)
else
MessageDlg('Ошибка удаления файла', mtInformation, [mbOk], 0);
.
end;

Функция: DiskFree(Drive: Byte): Int64; Модуль: SysUtils

Описание: Функция возвращает количество свободного места на диске, указанном в параметре Drive, в байтах. Диск определяется следующим образом: 0 — текущий, 1 — ‘A’, 2 — ‘B’, 3 — ‘С’, и т.д. Если указанный диск не существует, или недоступен, то функция возвращает -1.

Функция: DiskSize(Drive: Byte): Int64; Модуль: SysUtils

Описание: Функция возвращает размер диска Drive в байтах. Диск определяется следующим образом: 0 — текущий, 1 — ‘A’, 2 — ‘B’, 3 — ‘С’, и т.д. Если указанный диск не существует, или недоступен, то функция возвращает -1.

Функция: Eof(var Vf ): Boolean; Модуль: System

Описание: Функция определяет, стоит ли указатель текущей позиции в конце файла Vf (Vf — файловая переменная). Если указатель стоит на последнем символе файла, или файл не содержит данных, то функция возвращает True, а иначе — False.

Пример:
var
Vf1,Vf2: TextFile;
FileName1, FileName2: string;
C: Char;
begin
FileName1:='read.txt'; //подразумевается, что файл существует
FileName2:='write.txt';
AssignFile(Vf1, FileName1);
Reset(Vf1); //открывает файл 'read.txt'
AssignFile(Vf2, FileName2);
Rewrite(Vf2); //создает файл 'write.txt'
while not Eof(Vf1) do //повтор, пока не достигнут конец файла
begin
Read(Vf1, C); //читает символ из файла 'read.txt'
Write(Vf2, C); //записывает символ в файл 'write.txt'
end;
CloseFile(Vf2);
CloseFile(Vf1);
end;

Функция: FileExists(const FileName: string): Boolean; Модуль: SysUtils

Описание: Функция проверяет, существует ли файл с именем FileName. Если файл существует, то функция возвращает True, иначе — False.

Функция: FileGetAttr(const FileName: string): Integer; Модуль: SysUtils

Описание: Функция возвращает атрибуты файла, имя которого передано в параметре FileName. Атрибуты могут быть разделены с помощью оператора AND и следующих значений констант атрибутов:

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

В случае возникновении ошибки функция возвращает -1.

Функция: FilePos(var Vf): LongInt; Модуль: System

Описание: Функция возвращает текущую позицию указателя в файле (файл должен быть предварительно открыт). Параметр Vf представляет собой файловую переменную, ассоциированную с файлом. Данная функция не может быть применена к текстовым файлам.

Пример:
var
Vf: File of Byte;
S : string;
Size, I: Integer;
begin
Randomize; AssignFile(Vf, 'work.dat');
Rewrite(Vf); //создает файл work.dat
for I:= 0 to 100 do
begin
Seek(Vf, I);
Write(Vf, I); //записывает в файл послед. чисел от 1 до 100
end;
Size:= FileSize(Vf); //определяет размер файла
Seek(Vf, random(Size)); //устанавливает указатель в произвольную позицию
MessageDlg('Позиция указателя: ' + IntToStr(FilePos(Vf)), mtInformation, [mbOk], 0);
.
CloseFile(Vf);
end;

Функция: FileSearch(const FileName, DirList: string): string; Модуль: SysUtils

Описание: Функция осуществляет поиск файла FileName в каталогах, указанных в параметре DirList. Имя файла должно быть представлено в DOS-формате. Список каталогов DirList представляет собой строку, содержащую наименования каталогов, разделенных точками с запятой (например, ‘C:\;C:\WINDOWS; C:\WINDOWS\TEMP’). Если файл найден, то функция возвращает полный путь к файлу, а иначе возвращается пустая строка.

Функция: FileSetAttr(const FileName: string): Integer; Модуль: SysUtils

Описание: Функция устанавливает атрибуты файла, имя которого передано в параметре FileName. Атрибуты перечисляются в параметре Attr с помощью оператора OR. В случае успешного выполнения функция возвращает 0, а иначе возвращается код ошибки Windows.
Значение констант атрибутов:

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

Пример:для файла устанавливаются атрибуты ‘Скрытый файл’ и ‘Только чтение’.
FileSetAttr('MyFile.zzz', faReadOnly or faHidden);

Функция: FileSize(var Vf): Integer; Модуль: System

Описание: Функция возвращает размер файла, связанного с файловой переменной Vf в байтах. Для файлов типа Record функция возвращает количество записей. Если файл не содержит данных, то функция возвращает 0. Файл должен быть обязательно открыт. Данная функция не применима к текстовым файлам.

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

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

Описание: Функция используется в цепочке FindFirst - FindNext - FindClose для повторного поиска файла. Первый поиск осуществляется с помощью функции FindFirst. Функция FindNext возвращает следующий найденный файл, удовлетворяющий условиям поиска определенным при вызове функции FindFirst. В случае успешного выполнения, функция FindNext возвращает 0, а в случае возникновения ошибки — код ошибки Windows. По окончанию поиска необходимо высвободить память с помощью функции FindClose.

Функция: IOResult: Integer; Модуль: System

Описание: Функция возвращает статус ошибки последней выполненной операции ввода/вывода. Использование данной функции возможно только при отключенной проверке ошибок директивой компилятора <$I->. При возникновении ошибки ввода/вывода, все последующие операции ввода/вывода будут игнорироваться до тех пор, пока не будет сделано обращение к функции IOResult. Вызов IOResult очищает внутренний флаг ошибки. Альтернативным способом обработки ошибок ввода/вывода является использование механизма обработки исключительных ситуаций, который включается директивой компилятора <$I+>.

Функция: RenameFile(const OldName, NewName: string): Boolean; Модуль: SysUtils

Описание: Функция переименовывает файл OldName в NewName. При успешном выполнении возвращает True, а в случае ошибки False.

Пример:
begin
if RenameFile('OLD.TXT', 'NEW.TXT') then
MessageDlg(Файл переименован!', mtInformation, [mbOk], 0)
else
ErrorMsg('Невозможно переименовать файл!');
end;

| следующая лекция ==>
Современные способы и средства тушения пожаров | Работа с текстовыми файлами

Дата добавления: 2014-01-07 ; Просмотров: 879 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

WinAPI. Функции работы с файлами. Часть 2

Продолжаем изучать функции API Windows для работы с файлами. Сегодня мы познакомимся функциями для работы с целыми файлами такими как создание, удаление и копирование файлов. Помимо этого будут функции о получении инфы о файлах из системы.

Сегодня ты узнаешь про:

Функция копирует файл в новое место.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для Delphi есть ещё два варианта этой функции, которые отличаются только типом используемых переменных lpExistingFileName и lpNewFileName:

Первый и второй параметр содержат полные имена к файлам. Третий параматр указывает, что нужно делать, если файл уже существует. Если он равен TRUE, то произойдёт ошибка, если FALSE, то существующий файл будет перезаписан.

Если всё ничтяк, то функция вернёт TRUE

Пример использования CopyFile(‘c:\oldfile.exe’, ‘c:\newfile.exe’, false);

Функция создаёт новую директорию.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменной lpPathName:

Если всё ничтяк, то функция вернёт TRUE

Расширенная функция для создания новой директории. При создании используется указанный шаблон.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменных. Эти функции имеют имена CreateDirectoryExA и CreateDirectoryExW. Я не буду их приводить, просто запомни, что в функциях с буквой А в конце все переменные типа PChar превращаются в AnsiChar, а с префиксом W переменные PChar превращаются в WideString.

Если всё ничтяк, то функция вернёт TRUE

Функция создаёт указатель на новое устройство типа:

  • Файл
  • Канал
  • mailslot (почтовый канал)
  • комуникационный ресурс (например COM порт)
  • дисковые устройства (только для Windows NT)
  • консоли
  • директории (открывает их)

Функция умеет открывать и создавать новые устройства (файлы).

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменных. Эти функции имеют имена CreateFileA и CreateFileW. Я не буду их приводить, просто запомни, что в функциях с буквой А вконце все переменные типа PChar превращаются в AnsiChar, а с префиксом W переменные PChar превращаются в WideString.

В принципе, практически для всех API функций в Delphi доступно два дополнительных варианта, в которых действует описанное выше правило. Так что я больше не буду к этому возвращаться.

В С/С++ тоже есть три варианта, но различие в имени там бывает редко. Поэтому я даже не заикался об этом.

Теперь рассмотрим подробненько все параметры:

  • lpFileName — Указатель на строку содержащую имя создаваемого файла или устройства.
  • dwDesiredAccess — тип доступа. Может принимать значения (можно использовать одно или сразу несколько):
    • 0 — запрос. Функция не даст реального доступа к файлу, а выполнится как тест возможности создания или открытия файла (устройства).
    • GENERIC_READ — получить доступ к чтению
    • GENERIC_WRITE — получить доступ к записи
  • dwShareMode — флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять достум между процессами. Это значит, как будет делится доступ к файлу с другими прогами если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько):
    • FILE_SHARE_DELETE — другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT).
    • FILE_SHARE_READ — другим процессам разрешается только читать файл
    • FILE_SHARE_WRITE — другим процессам разрешается только писать в файл
  • lpSecurityAttributes — указатель на структуру типа SECURITY_ATTRIBUTES. Этот параметр используется только в Windows NT, в Win9x он игнорируется.
  • dwCreationDistribution — описывает, что делать с файлом если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация не допускается):
    • CREATE_NEW — создать новый файл. Если он уже существует, то произойдёт ошибка
    • CREATE_ALWAYS — а я сказал создать новый файл. Если файл существует, то он будет перезаписан (обнулён).
    • OPEN_EXISTING — открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка.
    • OPEN_ALWAYS — а я сказал открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW.
    • TRUNCATE_EXISTING — открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка.
  • dwFlagsAndAttributes — атрибуты создаваемого файла. Параметр может принимать комбинацию из значений:
    • FILE_ATTRIBUTE_NORMAL
      • FILE_ATTRIBUTE_ARCHIVE — архивный
      • FILE_ATTRIBUTE_COMPRESSED — сжатый
      • FILE_ATTRIBUTE_HIDDEN — скрытый
      • FILE_ATTRIBUTE_NORMAL — нормальный
      • FILE_ATTRIBUTE_OFFLINE — данные файла недоступны
      • FILE_ATTRIBUTE_READONLY — только для чтения
      • FILE_ATTRIBUTE_SYSTEM — системный
      • FILE_ATTRIBUTE_TEMPORARY — временный
    • FILE_FLAG_WRITE_THROUGH — возможность записи в файл через кэш.
    • FILE_FLAG_NO_BUFFERING — нельзя использовать буферы или кэш
    • FILE_FLAG_RANDOM_ACCESS — случайный доступ. Используется для оптимизации кэша
    • FILE_FLAG_SEQUENTIAL_SCAN — доступ к файлу может быть последовательный от начала до конца
    • FILE_FLAG_DELETE_ON_CLOSE — операционная система должна удалить файл, когда все указатели на файл будут закрыты
    • FILE_FLAG_BACKUP_SEMANTICS — Backup файл, т.е. файл резервного копирования.
    • FILE_FLAG_POSIX_SEMANTICS — доступ осуществляется в POSIX стандарте.
    • SECURITY_SQOS_PRESENT
      • SECURITY_ANONYMOUS — анонимный доступ
      • SECURITY_IDENTIFICATION — идентификационный доступ
      • SECURITY_IMPERSONATION — персональный доступ
      • SECURITY_DELEGATION — колективный доступ
      • SECURITY_CONTEXT_TRACKING — динамический режим доступа
      • SECURITY_EFFECTIVE_ONLY — ограничение груп и привелегий
  • hTemplateFile — файл шаблона

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

Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE.

Функция удаления существующего файла

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Если всё ничтяк, то функция вернёт TRUE

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

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Здесь стоит посмотреть на оба параметра подробнее:

  • lpFileName — строка содержащая путь для поиска файла. Эта строка может указывать на конкретный файл типа ‘c:\filename.txt’ или может хранить шаблон ‘c:\*.txt’. Если ты указываешь шаблон, то это даёт возможность перечислить все файлы удовлетворяющие шаблону.
  • lpFindFileData — структура WIN32_FIND_DATA, в которую будет записана инфа о найденном файле.

Расмотрим структуру WIN32_FIND_DATA немного подробнее:

Атрибутами файла может быть комбинация из флагов:

  • FILE_ATTRIBUTE_ARCHIVE — архивный
  • FILE_ATTRIBUTE_COMPRESSED — сжатый
  • FILE_ATTRIBUTE_HIDDEN — скрытый
  • FILE_ATTRIBUTE_NORMAL — нормальный
  • FILE_ATTRIBUTE_OFFLINE — данные файла недоступны
  • FILE_ATTRIBUTE_READONLY — только для чтения
  • FILE_ATTRIBUTE_SYSTEM — системный
  • FILE_ATTRIBUTE_TEMPORARY — временный

Размер файла разложен на два байта. Чтоб получить полный размер файла нужно выполнить действие (FInfo.nFileSizeHigh * MAXDWORD) + FInfo.nFileSizeLow. Это не самый эффективный (эффективнее сдвигать), но самый понятный способ.

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

Функция продолжает поиск начатый с помощью FindFirstFile.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Со вторым параметром всё ясно, он такой же, как и у FindFirstFile. А вот первый — это указатель на файл из предыдущего поиска. Он нужен, чтобы функция FindNextFile знала на каком файле ты остановил поиск и какой надо найти следующим. Немного позже мы рассмотрим реальный пример, чтобы тебе стало понятнее.

Если всё ничтяк, то функция вернёт TRUE

Функция завершает поиск файлов.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Если всё ничтяк, то функция вернёт TRUE

Пример для FindFirstFile, FindNextFile, FindClose

Функция позволяет узнать текущую директорию, с которой сейчас работает твоя прога.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт длину lpBuffer в котором хранится путь текущей директории.

Функция позволяет узнать текущую директорию, с которой сейчас работает твоя прога.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт не ноль.

Ну всё, на сегодня хватит. Я и так уже накатал 20 кило инфы. В следующий раз продолжим.

Delphi

КОМПЬЮТЕРНЫЕ КУРСЫ «ПОИСК»

Поиск файлов

При поиске файлов с помощью Delphi используется запись TSearchRec и следующие три функции: FindFirst, FindNext и FindClose. Запись TSearchRec и три функции объявлены в модуле SysUtils.

Чтобы начать поиск каталога, вы должны вызвать функцию FindFirst:

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

При вызове функции FindFirst для начала поиска файлов вы должны передать в параметре Path как путь к каталогу, так и маску файлов. Следовательно, если необходимо найти все текстовые файлы в корневом каталоге диска С. укажите С:\*.txt в параметре Path.

Параметр Attr позволяет искать дополнительные типы файлов — системные файлы, скрытые файлы и тому подобные. В качестве параметра Attr могут быть переданы следующие константы, которые также объявлены в модуле SysUtils: faReadOnly, faHidden, faSysFile, faDirectory, faArchive и faAnyFile. Существует также константа faVolumelD, но она нигде не является важной и обозначена как неиспользуемая.

Илон Маск рекомендует:  Что такое код memcmp

При вызове функций FindFirst и FindNext в качестве параметра F необходимо передавать переменную TSearchRec. Обе функции хранят результаты поиска в параметре F, и обе возвращают 0, если файл был найден, или флаг ошибки, не равный 0, если подходящих файлов найдено не было.

Если функция FindFirst возвращает 0, вы можете вызвать функцию FindNext в цикле, чтобы попробовать найти другие файлы, совпадающие с критерием поиска.

В конце следует вызвать функцию FindClose, чтобы освободить память, занимаемую функцией FindFirst:

procedure FindClose (var F: TSearchRec);

В листинге ниже показано, как производится поиск всех файлов в корневом каталоге диска С.

Перечисление доступных устройств

Перечислить доступные устройства можно с помощью API-функции GetLogicalDrives или API-функции GetDriveType (обе функции объявлены в модуле Windows).
Функция GetLogicalDrives является очень простой, поскольку она не принимает никаких параметров;

function GetLogicalDrives: DWORD; stdcall;

Эта функция имеет серьезный недостаток: необходимо знать о том, как проверить, что определенный бит в результирующем значении включен или выключен. Она возвращает битовую маску, в которой бит в позиции 0 представляет устройство А, бит в позиции 1 — устройство В и так далее.

Процедура EnumerateDrives демонстрирует использование функции GetLogicalDrives для перечисления доступных устройств.

Код для перечисления доступных устройств будет более понятен, если использовать функцию GetDriveType. Функция GetDriveType служит для определения, является ли устройство фиксированным, съемным или другим, однако ее можно использовать и для перечисления устройств.

Функция GetDriveType принимает указатель на строку с завершающим нулем, содержащую корневой каталог диска, который требуется проверить. Строка, содержащая корневой каталог, должна включать символ обратной косой черты, например, х:\.

function GetDriveType(lpRootPathName: PChar): UINT; stdcall;

В случае успешного выполнения эта функция возвращает одну из констант, перечисленных ниже.

Результаты выполнения функции GetDriveType

Константа Описание
DRIVE_UNKNOWN Неизвестный тип устройства.
DRIVE_NO_ROOT_DIR Корневой каталог не существует.
DRIVE_REMOVAELE Устройство является съемным.
DRIVE_FIXED Устройство является фиксированным.
DRIVE_REMOTE Устройство является сетевым диском.
DRIVE_CDROM Устройство является приводом CD-ROM.
DRIVE_RAMDISK Устройство является виртуальным диском (RAM-диском).

Процедура EnumerateDrives2 в листинге ниже демонстрирует использование функции GetDriveType для перечисления доступных устройств.

В заключение, можно создать простой обозреватель каталогов, добавив в окно Designer Surface (Окно конструктора) компонент TComboBox, и добавив в него доступные устройства в событии OnCreate формы.

Вам придется также присвоить свойству Style компонента TComboBox значение csDropDownList, чтобы пользователь мог выбирать только существующие элементы, и написать обработчик события для его события OnChange, чтобы просматривать корневой каталог выбранного диска:

Источник: Иван Хладни — Внутренний мир Borland Delphi 2006.

Программирование Delphi

Все о программировании.

Главное меню

Компонент TFindFile с исходным кодом

Статьи
Индекс материала
Компонент TFindFile с исходным кодом
Страница 2
Все страницы

В этой статье мы создадим компонент TFindFile, в котором инкапсулирован код с функциями FindFirst, FindNext и FindClose. Идея состоит в том, чтобы создать невизуальный компонент Delphi, который заполняет объект TListString списком файлов (полный путь + имя файла) по некоторой существующей маске.

Естественно, мы должны получить наш компонент из TComponent.

Свойства TFindFile

Вот свойства компонента TFindFile

  • FileAttr — инкапсулированный параметр Attr, который используется в функции FindFirst. Например, чтобы искать и скрытые файлы и только для чтения, установите и ffaReadOnly и ffaHidden в True.
  • FileMask — используется, чтобы установить маску имени файла, включая подстановочные символы.
  • InSubFoldersTrue, если мы хотим искать файлы рекурсивно во всех подкаталогах данного пути, False — иначе.
  • Path — определяет каталог, в котором мы хотим искать файлы.
  • Name и Tag — получены от TComponent.

Методы TFindFile

Единственная работа компонента TFindFile — это заполнить некоторый объект TStringList списком файлов, который соответствует некоторым критериям, поэтому он имеет единственный метод SearchForFiles. Выполнение его подобно:

Обратите внимание: переменная s (частная для компонента) имеет тип TStringList. Процедура SearchForFiles вызывает процедуру FileSearch (тоже частная). Процедура FileSearch заполняет (рекурсивно) переменную s списком всех найденных файлов.

TFindFile в действии

Чтобы увидеть компонент в действии, запустите новый проект Delphi, поместите один компонент TListBox, один TButton и конечно один TFindFile на форму. При нажатии на кнопку заполняется свойство Items у TListBoxа всеми файлами, которые найдены компонентом TFindFile. Только одна строка кода, вот и все, что нужно:

Естественно, все свойства компонента TFindFile первоначально были установлены во время проектирования. Когда Вы опускаете компонент TFindFile на форму, свойство Path указывает на текущий каталог, маска файла равна *.*, а свойство InSubFolders установлено в False по умолчанию.

Обратите внимание: функция SearchForFiles заполняет объект StringList, в дополнение к ListBox мы можем использовать Memo (свойство Lines) или TComboBox (свойство Items).

Создание и выполнение TFindFile во время выполнения

Как и любой другой компонент Delphi, компонент TFindFile может быть создан, использоваться и разрушен во время выполнения. Чтобы создать компонент TFindFile во время выполнения, можно использовать следующий код (если предположить, что мы имеем TMemo по имени Memo1):

Эта часть кода создает компонент TFindFile во время выполнения и заполняет компонент Memo всеми файлами *.pas, которые найдены во всех подкаталогах запущенного приложения.

Примечание 1: Если Вы посмотрите на код TFindFile, Вы заметите, что каждый раз, когда Вы пытаетесь изменить свойство Path (процедура SetPath): если указанный каталог не существует, свойство Path восстанавливается.

Примечание 2: Если Вы хотите определить к какому каталогу принадлежит данная папка, установите‘.’ в свойстве Path, если Вы установите ‘..’ в свойстве Path, это свойство укажет на родительскую папку.

_findclose _findclose

Закрывает указанный дескриптор поиска и освобождает связанные ресурсы. Closes the specified search handle and releases associated resources.

Синтаксис Syntax

Параметры Parameters

справиться handle
Маркер поиска, возвращенный предыдущим вызовом _findfirst. Search handle returned by a previous call to _findfirst.

Возвращаемое значение Return Value

В случае успеха _findclose возвращает 0. If successful, _findclose returns 0. В противном случае возвращается значение-1 и устанавливается значение еноент, указывающее, что больше не удалось найти соответствующие файлы. Otherwise, it returns -1 and sets errno to ENOENT, indicating that no more matching files could be found.

Требования Requirements

Функция Function Обязательный заголовок Required header
_findclose _findclose

Дополнительные сведения о совместимости см. в разделе Совместимость. For more compatibility information, see Compatibility.

FindClose — Функция Delphi

The file search handle.

Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

After the FindClose function is called, the handle specified by the hFindFile parameter cannot be used in subsequent calls to the FindNextFile, FindNextFileNameW, FindNextStreamW, or FindClose functions.

In Windows 8 and Windows Server 2012, this function is supported by the following technologies.

FindClose — Функция Delphi

Разделы сайта:

Связь:

Доброго времени суток, уважаемые читатели!

Поздравляю всех с прошедшими праздниками: Новым Годом, Рождеством и Старым Новым Годом!

Наконец-то пришло время представить общественности систему, о которой речь шла месяца полтора назад. Это система получения файлов с нашего сайта по электронной почте. В настоящее время эта система практически готова и теперь она запущена в тестовый режим. Возможно, система может работать неправильно. Если Вы заметили ошибки или файл не пришёл вовсе — сообщайте об этом. А теперь о том, как пользоваться системой. Система очень проста:
— Отправляете письмо на адрес robot@delphi.int.ru с темой » GetFile=N » (без кавычек), где N — индексный номер файла, который Вы хотите получить. Эти номера присутствуют в каждой из ссылок на файлы. Перейдите, к примеру, в раздел «Файловый архив» и наведите курсор на любую из ссылок «Загрузить» — Вы увидите саму ссылку, в конце которой и указан номер файла. Именно это значение и нужно подставить вместо » N «. Обратите внимание: эта служебная строка (» GetFile «) должна быть прописана именно в теме письма, а не в его тексте. Если запрос будет неверный, робот проигнорирует письмо. А теперь самое главное — робот не работает постоянно . В целях снижения нагрузки на сервер, робот активируется лишь 4 раза в сутки — в 00:00 , 06:00 , 12:00 и в 18:00 (МСК). Соответственно, запрошенные файлы отправятся на e-mail примерно в это время. Будьте внимательны: сколько запросов отправлено, столько файлов и пришлёт робот, даже если файл один и тот же. Надеюсь, Вам понравится эта система!

А теперь от хорошего к плохому. Особенно остро стоит вопрос о форуме сайта. На форуме присутствуют всего несколько активных участников. Новые темы практически не создаются. Зато скапливается большое количество спама. Уже несколько раз делалась глобальная чистка, но. Зачем нужен форум, если им никто не пользуется? Только занимать лишнее дисковое пространство? В связи с этим я вынуджен конкретно поставить вопрос:

Что делать с форумом на сайте?

Этот опрос не является шуткой. У меня действительно есть желание закрыть форум. Впрочем, результаты опроса серьёзно повлияют на моё мнение. Если не трудно, укажите также своё мнение об этой ситуации.

Внимание! Вопросы и ответы для следующего выпуска рассылки принимаются до 21.01.2006 18:00 . Будьте внимательны. Письма, присланные позже откладываются для публикации в следующем выпуске.

Разделы рассылки:

Количество читателей рассылки: 3918.

Подписка на рассылку:

Лидеры по количеству баллов:

Сегодня я решил немного «приоткрыть занавес» и показать не 10 лидеров, а первые 15 позиций.

Ermakova Dasha Садовников Владимир Матвеев И.В. Андрей Лучников Ершов Денис Igor Danilevych Трапезников Антон

А вот некоторая статистическая информация:

Статусы экспертов и их возможности:

Примечание: Под форматированием текста понимается возможность оформлять ответы с использованием html-тегов.

Если Вы хотите, чтобы Вашего имени (ника) не было в данной таблице, отправьте письмо по этой ссылке с зарегистрированного у нас адреса. В теле письма, пожалуйста, укажите причину удаления имени из таблицы. Нам важно ваше мнение.


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде «да я не знаю» или «да/нет». Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с «неправильными» темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Вопрос #216 (автор вопроса: Jake; вопрос отправлен: 31.12.2005 20:14):

У меня такая ситуация: имеется форма и компоненты RadioButton (порядка 20) на ней, после компиляции (во время работы с написаной программой) некоторые RadioButton`ы переходят в состояние Disabled, как и задумано ранее. Вопрос такой: как сделать кнопку «сброс» (сам код) которая при нажати переводила бы все RadioButton`ы в Enabled, или же открывала форму заново? Желательно какое-нибудь «компактное решение», а не:

RadioButton1.Enabled:= True; RadioButton2.Enabled:= True; .

Вопрос #217 (автор вопроса: Sadowsky Vladimir T; вопрос отправлен: 01.01.2006 17:42):

Здравствуйте, уважаемые эксперты! С Новым 2006 Годом Вас. Подскажите пожалуйста: как используя объект TShellTreeView создать новый подкаталог и отобразить его в окне TShellTreeView? Заранее всем спасибо. [Ответить на вопрос]

Вопрос #218 (автор вопроса: Олег; вопрос отправлен: 03.01.2006 13:29):

Всем привет! Есть желание, но нет возможности замутить для своего чата банальные смайлики. Чат на сокетах для локальной сети. Что можно использовать в качестве отображения мессаджей и смайлов? Если есть компонент специальный, подскажите пожалуйста, где его взять. Спасибо заранее. [Ответить на вопрос]

Вопрос #219 (автор вопроса: illuha; вопрос отправлен: 04.01.2006 20:51):

Здравствуйте!
Первый вопрос такой: Программа сканирует реестр, и когда дохожу к ключу HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\lanmanserver\Shares, то функция RegQueryInfoKey выдает, NumSubKeys=1, а MaxSubKeyLen=0 и дальше пошла ошибка получения имени ключа. В чем причина? Открываю RegOpenKeyEx с атрибутом KEY_READ.
А вот и второй: В некоторых ключах RegOpenKeyEx выдает ошибку 2 или 5, хотя в ключе присутствуют данные, почему? [Ответить на вопрос]

Вопрос #220 (автор вопроса: Роман; вопрос отправлен: 06.01.2006 02:16):

Как на Delphi 7 создать красивую форму наподобие Winamp’a? [Ответить на вопрос]

Вопрос #221 (автор вопроса: Садовников Владимир; вопрос отправлен: 06.01.2006 18:13):

Нужно написать что-то вроде текстового чата. Для этого я решил использовать два консольных буфера (CreateConsoleBuffer), которые потом копируются на общую консоль. С выводом, вроде всё в порядке. Кто-нибудь может подсказать, как при помощи WinAPI написать функцию ввода строки в нужном месте главной консоли, используя один из буферов? [Ответить на вопрос]

Вопрос #222 (автор вопроса: Ilay Babakov; вопрос отправлен: 10.01.2006 20:33):

Уважаемые программисты, подскажите как из БД Access оперировать данными (числами) (арифметические действия), или вывести определённую ячейку? Заранее благодарен. [Ответить на вопрос]

Вопрос #223 (автор вопроса: Игорь; вопрос отправлен: 13.01.2006 10:29):

Есть поле редактирования RichEdit2, строки в котором переписываются через заданое время. Нужно, чтобы при перемещении над полем курсора мыши, строки, вернее текст в этих строках, который попадает под курсор мыши становился жирным и подчеркнутым, также чтобы менялся вид курсора мыши. И все это чтобы возвращалось в прежнее состояние при потере курсора мыши. Также нужно, чтобы при двойном нажатии клавиши мыши, текст находящийся под курсором мыши, сохранялся в какую то текстовую переменную, или заносился в поле редактирования Edit1. Как это все сделать? [Ответить на вопрос]

Вопрос #205 (автор вопроса: Vitek; вопрос отправлен: 10.12.2005 21:05):

У меня такой вопрос: как можно написать DLL для нормального чтения mov и avi в кодировке DivX(Xvid), mpeg4, ну и др. какие-нибудь? Или есть какие компоненты? Использую MediaPlayer из Delphi7. Просто когда открываю такой файл, то нет звука, чёрный экран, или изображение идёт по ключевым фреймам. [Ответить на вопрос]

Вопрос #212 (автор вопроса: Владимир; вопрос отправлен: 18.12.2005 20:30):

Подскажите пожалуйста, кто работал с XStringGrid, как прикрутить форму к FormCellEditor? Что-то разобраться не могу, и документации никакой на офсайте нет, или ссылку на документацию. [Ответить на вопрос]

Вопрос #215 (автор вопроса: Аркадий; вопрос отправлен: 27.12.2005 05:06):

Как сделать поиск в mdb или mde, в обьектах (таблицы, запросы, макросы, модули) и изменять функции? [Ответить на вопрос]

Вопрос #197 :
Я новичок в программировании. Как можно в Delphi на OpenGL загрузить .x файл? P.S. Просто этот файл удобен тем, что его можно открыть обычным текстовым блокнотом и просмотреть его структуру. А я очень хочу понять принцип — как загружать файлы 3D сцен в Delphi (как осуществлять перехот от одной координаты в другую, записанную в файле 3D модели, как отличать один объект от другого и т.д.) Буду очень благодарен за исходник с подробными объяснениями. Спасибо заранее!

1. [Отвечает: midav.land.ru, 03.01.2006 14:34]: К сожалению, я не знаю формата файла .x и в интернете не нашёл ничего внятного. Приведи пример файла или программу, который может их обрабатывать. А в общем для загрузки пишут лексический анализатор. Тема достаточно избита в узких кругах и при наличии сведений о структуре решается достаточно просто.

Оценка за ответ: 4 .

Вопрос #209 :
Можно ли узнать когда был «расшарен» каталог в сети. Т.е. узнать дату, когда на каталог был установлен общий доступ, если этот каталог находится не на моей машине и я имею к нему только «сетевой» доступ?

1. [Отвечает: PVS, 03.01.2006 10:43]: Вряд-ли. Разве только на машине настроено очень подробное журналирование и у Вас есть доступ на чтение журналов (удаленное чтение, если я правильно понял). Если же нужный каталог на win98 — это, скорее всего, нереально ни при каких условиях.

Оценка за ответ: 5 .

Вопрос #210 :
Здравствуйте уважаемые эксперты! Подскажите пожалуйста: как превратить ячейку StringGrid’a в многострочный редактор типа TMemo, другими словами — добавить свойство Lines? Заранее всем спасибо.

1. [Отвечает: Деревянко Евгений, 31.12.2005 13:08]: Если нужно только отображать, то для этого может быть достаточно отключить DefaultDrawing для грида и переопределить рисование ячейки. А как разделителем строк в поле cells[ACol, ARow] можно записать какой-то символ или их комбинацию, например символ

. Тогда нужно будет анализивовать cells на разделитель и выводить в строках. А если необходимо и редактировать текст, то на событие GetEditText грида можно подставлять Memo точно по размеру ячейки и передать туда текст из ячейки грида, а на MemoOnExit спрятать memo и передать в ячейку грида текст: cells[ACol, ARow] := memo.lines[1]+’

‘+memo.lines[2]. и т.д. Вариант не идеальный, но остальное можно по надобности дофантазировать.

Оценка за ответ: 5 .

2. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Если Вы хотите просто выводить многострочный текст в ячейках StringGrid’а — просто так это не получится сделать, так как StringGrid использует метод TCanvas.TextRect для рисования текста, а он не умеет выводить многострочный текст. Но Вы можете самостоятельно обрабатывать событие OnDrawCell и рисовать там многострочный текст, вот пример:

Оценка за ответ: 5 .

3. [Отвечает: dasha ermakova, 04.01.2006 14:42]: Многострочность ячеек StringGr >var Form1: TForm1; NCol,NRow: integer; implementation uses Types; <$R *.dfm>procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Height:=StringGr ; Memo1.Top:=StringGr >

Оценка за ответ: 5 .

4. [Отвечает: Антон Трапезников, 09.01.2006 09:23]: Здравствуйте, Денис. Сперва необходимо установить свойство DefaultDrawing в False. Далее, необходимо вставить следующий код в обработчик события OnDrawCell:

procedure TForm1.StringGr , hGrid.Cells[Col, Row]); if ptr > 0 then begin Line1 := Copy(hGr > 0 then hGrid.Canvas.TextOut(Rect.Left, Rect.Top — hGrid.Canvas.Font.Height + 3, Line2); end;

Теперь достаточно для переноса строки вставить в неё точку с запятой. Так же не забудьте изменить высоту строки так, чтобы переносы строки поместились в ячейку:

Оценка за ответ: 5 .

Вопрос #211 :
Как написать программу, которая будет определять какие пользователи есть на компьютере? Допустим, нажать кнопку и в memo создастся список всех пользователей.

1. [Отвечает: MiXei4, 30.12.2005 17:27]: Пишем модуль.

unit GetUser; interface uses Sysutils, > NERR_SUCCESS) or (info = nil) then Exit; p := PChar(info); for i := 0 to dwERead — 1 do begin inf := PUSER_INFO_10(p + i * SizeOf(TUSER_INFO_10)); ulist.Add(WideCharToString(PWideChar((inf^).usri10_name))); end; NetApiBufferFree(info); end; end.

Дальше в программе используем процедуру GetLocalUserList из этого модуля, передавая в качестве параметра переменную типа TStringList. В ней и будет список всех пользователей.

Оценка за ответ: 5 .

2. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Все данные есть в реестре + функция LookupAccountSid, привожу пример, позволяющий определить список пользователей не только на своем, но и на сетевых компьютерах. См. Приложение. Загрузить прикреплённый файл >>

Оценка за ответ: 5 .

3. [Отвечает: PVS, 03.01.2006 11:19]: Надо использовать функцию NetUserEnum. При праметре level=0 (это как раз имя пользователя) ее может использовать любой пользователь. На локальном компьютере ServerName=nil. Filter — по надобности. BufPtr -указатель на USER_INFO_0 . PrefMaxLen = SizeOf(USER_INFO_0)

repeat
.
retval=NetUserEnum(. );
.
until retval<>ERROR_MORE_DATA;

Оценка за ответ: 5 .

4. [Отвечает: mfred, 04.01.2006 17:24]: Привет, вот код для вывода всех пользователей я его нашел на delphiworld.narod.ru. У меня не работает, попробуй может что придумаешь.

unit Func; interface uses Sysutils, > NERR_SUCCESS) or (info = nil) then Exit; p := PChar(info); for i := 0 to dwERead — 1 do begin inf := PUSER_INFO_10(p + i * SizeOf(TUSER_INFO_10)); ulist.Add(WideCharToString(PWideChar((inf^).usri10_name))); end; NetApiBufferFree(info); end; end.

Оценка за ответ: 5 .

5. [Отвечает: dasha ermakova, 04.01.2006 17:39]: В папке «C:\Documents and Settings» все папки, кроме скрытых, а также «All Users» и «Administrator» именованы логинами пользователей. Поэтому составить их список можно так:

procedure TForm1.Button1Click(Sender: TObject); var Dir: string; SearchRec:TSearchRec; begin Dir:=’C:\Documents and Settings\’; if FindFirst(Dir+’*.*’,faAnyFile,SearchRec)=0 then repeat if (SearchRec.name=’.’) or (SearchRec.name=’..’) then continue; if ((SearchRec.Attr and faDirectory)<>0) and ((SearchRec.Attr and faH >’All Users’) and (SearchRec.Name<>‘Administrator’) then try Memo1.Lines.Add(SearchRec.Name) except end; until FindNext(SearchRec)<>0; FindClose(SearchRec); end;

Оценка за ответ: 5 .

6. [Отвечает: Антон Трапезников, 09.01.2006 09:24]: Здравствуйте, Павел. GetLocalUserList — возвращает список пользователей (Windows NT, Windows 2000). Исходник.

Оценка за ответ: 5 .

Вопрос #213 :
Каким образом узнать количество страниц в документе Word и загрузить в OleContainer страницу с нужным номером?

1. [Отвечает: midav.land.ru, 03.01.2006 14:21]: Кажись никак. Он по умолчанию грузит с самого начала. Проще наверное разбить на странички (один документ — одна страничка).

Оценка за ответ: 3 .

Вопрос #214 :
Нужно сделать небольшую программу для обмена сообщениями в локальной сети. Программа должна сидеть в трее и реагировать на входящие собщения. Вопрос: какие компоненты будет лучше всего использовать?

1. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Передавать данные через сеть можно либо по протоколу TCP/IP, либо по UDP. Если Вы хотите использовать TCP/IP — используйте компоненты TClientSocket/TServerSocket (палитра Internet). Готовый пример чата из книги Сергея Бобровского «Delphi 6 и Kylix» смотите в приложении к письму. Если UDP — используйте TIdUDPClient/TIdUDPServer с палитры Indy. Загрузить прикреплённый файл >>

Оценка за ответ: 5 .

2. [Отвечает: PVS, 03.01.2006 11:32]: Зависит от того какая версия Delphi. В разных версиях туда включались разные не-Borland’овские компоненты, которые, в принципе, могут облегчить задачу, но если нужно самое работающее(на мой взгляд) решение, то надо использовать TSocket — он есть везде (кажется и в Kylix’e).

Оценка за ответ: 5 .

3. [Отвечает: m >.

Оценка за ответ: 5 .

4. [Отвечает: dasha ermakova, 04.01.2006 16:47]: Для локальной сети удобно использовать UDPClient и UDPServer. Нужно поставить на них одинаковый номер Port и DefaultPort, после чего в свойстве сервера Bindings создать новый элемент, указав IP address = all и свой номер порта. Очень важно, чтобы этот номер нигде не использовался. А еще установить BroadcastEnabled = true. После чего можно посылать сообщения клиентом с помощью Broadcast или Send. При этом указывать свой номер порта, а в случае Send — IP принимающего компьютера. Для реакции на входящие сообщения есть событие сервера OnUDPRead. Для общения приложения с треем очень удобный компонент CoolTrayIcon, он есть на сайте рассылки.

Оценка за ответ: 5 .

5. [Отвечает: mfred, 04.01.2006 17:39]: Я бы использовал ClientSocket и ServerSocket которые нужно установить: Компоненты/Установить пакеты дальше надо открыть файл dclsockets70.bpl ОК. И они появятся на вкладке интернет.

Оценка за ответ: 4 .

6. [Отвечает: Антон Трапезников, 09.01.2006 09:56]: Для Вашей задачи лучше всего, имхо, использовать протокол udp (TUDPSocket), т.к. в нем нет таких понятий как клиент и сервер. Минусом дейтаграмного протокола является то, что он, в отличие от TCP, не гарантирует правильную доставку пакета получателю, а просто шлет данные. Если же Вы хотите использовать TCPSocket-ы, то кто-то должен быть сервером, а кто-то клиентом, что, конечно же, не удобно. В сети очень много исходных текстов для аналогичных программ. Вот ссылка на один из них: http://www.sources.ru/delphi/internet/rlmes.zip. З.Ы. В examle-ах к Delphi есть пример чат программы с использованием TCP.

Оценка за ответ: 5 .

Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе «Эксперт»: http://www.delphi.int.ru/modules.php?name=expert.

Программный поиск файлов

Многим известны программы, где можно искать файлы, правила поиска файла. Файлы можно искать как с файловых командирах (NC, VC, DOS Navigator, Far), так в любой операционной системе. В операционной системе windows диалоговое окно поиска файла вызывается «Пуск» — «Поиск» — «Файлы и папки». В открывшимся окне необходимо задать условие искомого файла (название, маска) и путь начального поиска (каталог). На других вкладках этого диалогового окна можно расширить возможности поиска по дате изменения, по содержащемуся тексту, по размеру.

Вспомним правила поиска файлов. Вы можете задать как имя искомого файла, так и его маску, если название неизвестно или необходимо найти несколько. Т.е. применяя специальный шаблон поиска, вы можете организовать условия выборки найденных файлов. Сразу оговорюсь, что поиск можно применять как к файлам, так и к каталогам. Будем их называть элементами файловой системы. В шаблон маски искомых элементов может входить:

  1. Буквы и цифры в названии и расширении.
  2. Символ * (звездочка, математический знак «умножить»), заменяющий любое количество всевозможных букв и цифр в названии или расширении.
  3. Символ ? (знак вопроса), заменяющий одну букву или цифру в названии или расширении искомого элемента.

Например, вы ищите все текстовые файлы с расширением TXT. В поле имени искомого файла вам нужно ввести «*.TXT» (пишется без кавычек) и система найдет все такие файлы в указанном диске или каталоге. Если вам надо найти все файлы с названием semen, то в поле поиска файла нужно ввести «semen.*». Если вам нужно найти элементы с третьей буквой k и с первой буквой t в расширении, то вводите «??k*.t*». Здесь знак вопроса указывает на любой символ, третьим символом по порядку идет буква k, далее название файла (каталога) может состоять из любого количества букв и цифр, указываем звездочку. В расширении первая буква t, дальше следует любое расширение.

Примечание: файлы и каталоги в операционной системе windows ищутся без учета регистра, т.е. строчние и прописные буквы не различаются.

Теперь рассмотрим программный поиск файлов с помощью языка программирования object pascal.

Вся организация цикла поиска, а именно это и есть цикл с продолжением поиска, сводится к:

  • Задание условий поиска. Это каталог и маска искомого элемента или элементов, атрибуты элемента(ов). При задании условий поиска сразу происходит поиск первого подходящего под условие. Это функция FindFirst.
  • Продолжение поиска следующего элемента по заданным в первом пункте условиям. Это функция FindNext и она может вызываться сколько угодно раз, пока все файлы и каталоги, удовлетворяющие условию, не будут найдены.
  • Закрытие поиска и освобождение памяти, выделяемую системой под поиск. Команда FindClose.

Функция FindFirst.

FindFirst (КАТАЛОГ_ПОИСКА_И_МАСКА_ФАЙЛА, АТРИБУТЫ_ИСКОМОГО_ФАЙЛА , ПОИСКОВОЯ_ПЕРЕМЕННАЯ);

где: Каталог для поиска и маска искомого элемента — строковая величина, имеющая тип String, может, например, содержать ‘c:\*.*’ — все элементы в корне диска С. Обратите внимание, что указывается полный путь для поиска.

Атрибуты искомого элемента это пользовательские или системные атрибуты, которые может иметь файл (каталог, метка диска). Вот их перечень:

  • faReadOnly — Файлы «только чтение». Такой атрибут устанавливается на файлы, которые не рекомендовано изменять, удалять. Такой атрибут имеют файлы, например, записанные на компакт-дисках.
  • faHidden — Скрытые файлы. При обычных установках браузера и командира эти файлы невидимы.
  • faSysFile — Системные файлы.
  • faVolumeID — Файл метки диска. Такой элемент в своем имени имеет название диска (максимум 11 символов).
  • faDirectory — Атрибут признака каталога.
  • faArchive — Обычный файл. По умолчанию устанавливается на заново создаваемых файлах.
  • faAnyFile — Если установить в качестве атрибута искомых элементов, то будет произведен поиск по всем вышесказанным атрибутам.

Эти вам нужно искать только элементы, имеющие атрибут «каталог» и «скрытый», то можно применить знак математического сложения, например faDirectory + faHidden.

Поисковая переменная имеет тип TSearchRec. В нее, при успешном результате поиска, будет занесены все необходимые данные о найденном файловом элементе.

Поскольку FindFirst является функцией, то она должна сама возвращать некоторое значение. Это значение имеет тип Integer и означает результат поиска файла (код ошибки поиска). Если файл найден, то принимает нулевое значение.

Эта функция продолжает поиск, заданный в функции FindNext. Возвращает значение результата поиска (нулевое в случае успешного поиска).

Закрывает поиск и освобождает память, выделенную системой под поиск.

Теперь рассмотрим пример. Допустим, нам надо найти все файлы и каталоги в каталоге DELPHI, находящийся на диске C:. В дальнейшем, вы можете самостоятельно, изменяя маску, менять условия поиска. Для формы с компонентом ListBox1 и кнопкой Button1 реакция на OnClick по кнопке:

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; // поисковая переменная FindRes:Integer; // переменная для записи результата поиска begin ListBox1.Clear; // очистка компонента ListBox1 перед занесением в него списка файлов // задание условий поиска и начало поиска FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do // пока мы находим файлы (каталоги), то выполнять цикл begin ListBox1.Items.Add(SR.Name); // добавление в список название // найденного элемента FindRes:=FindNext(SR); // продолжение поиска по заданным условиям end; FindClose(SR); // закрываем поиск end;

Представленный пример кода, в принципе, является основой для организации более углубленного поиска, поиска файлов по времени создания, по содержащимся словам. Если вы запустите эту программу на выполнение, то при нажатии на кнопку Button1 вы увидите в списке в первой и второй строке элементы «.» и «..». Это элементы, имеющие атрибут «каталог». Первый содержит связь с корневым каталогом диска, второй содержит связь к каталогом верхнего уровня. Со вторым вы встречаетесь в дисковых командных оболочках, например нортон, когда выбираете каталог «..» и нажимаете на «ввод». Тем самым вы попадаете в каталог на уровень выше. Естественно, в нашей поисковой программе такие элементы не надо вносить в список, поэтому мы игнорируем их нахождение. Исправляем процедуру нажатия на кнопку Button1:

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; FindRes:Integer; begin ListBox1.Clear; FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do begin // если найденный элемент каталог и if ((SR.Attr and faDirectory)=faDirectory) and // он имеет название «.» или «..», тогда: ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); // продолжить поиск Continue; // продолжить цикл end; ListBox1.Items.Add(SR.Name); FindRes:=FindNext(SR); end; FindClose(SR); end;

В этом случае, при нахождении каталога с именем «.» или с именем «..» программа продолжит обработку цикла поиска без вывода найденного имени элемента в компонент списка ListBox1.

Теперь рассмотрим тип TSearchRec. Он имеет в себе несколько полезных свойств:

  • Name — название найденного каталога (файла);
  • Size — размер файла в байтах;
  • Attr — атрибуты каталога (файла);
  • Time — упакованное значение времени и даты создания каталога (файла).

Все вышеперечисленные свойства мы уже рассмотрели или они понятны сразу, за исключением свойства Time. Оно имеет тип Integer и содержит в себе упакованное значение даты и времени создания файла. Распаковка производится с помощью функции FileDateToDateTime, которая в результате возвращает значение даты и времени.

Теперь добавим в нашу форму компонент DateTimePicker1 (страница Win32) и допишем несколько строк.

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; FindRes:Integer; begin ListBox1.Clear; FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); Continue; end; // если у файла (каталога) дата создания меньше, // чем установлено в DateTimePicker1, то if FileDateToDateTime(SR.Time) procedure FindFile(Dir:String);

А в разделе кода программы, до слова «end.» вставляем пустой каркас процедуры

procedure TForm1.FindFile(Dir:String); begin end;

На форму вставляем компонент списка ListBox1, Button1, Edit1. Для компонента Edit1 свойство Text устанавливаем в «c:\delphi\». Обратите внимание на последний символ, знак «\», присутствие которого в начальном пути поиска обязательно. Дальше процедура OnClick для кнопки Button1 выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Clear; // очистка списка файлов FindFile(Edit1.Text); // поиск файлов с начальными условиями, заданных в Edit1 end;

Созданная нами вручную процедура поиска:

procedure TForm1.FindFile(Dir:String); Var SR:TSearchRec; FindRes:Integer; begin FindRes:=FindFirst(Dir+’*.*’,faAnyFile,SR); While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); Continue; end; // если найден каталог, то if ((SR.Attr and faDirectory)=faDirectory) then begin // входим в процедуру поиска с параметрами текущего каталога + // каталог, что мы нашли FindFile(Dir+SR.Name+’\’); FindRes:=FindNext(SR); // после осмотра вложенного каталога мы продолжаем поиск // в этом каталоге Continue; // продолжить цикл end; ListBox1.Items.Add(SR.Name); FindRes:=FindNext(SR); end; FindClose(SR); end;

Если вы в компоненте Edit1 в качестве начального условия поиска файлов зададите корневую папку диска, например «С:\», то вы получите полный перечень всех файлов на данном диске. Обратите внимание на скорость поиска файлов и скорость работы вашей программы.

Присылайте свои статьи по адресу info@delphi.int.ru с темой ‘Articles’ (без кавычек), и они будут опубликованы в ближайших выпусках рассылки и на сайте. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in’ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное. Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

Новые файлы на сайте:

Color’a — Программа для работы с цифровым значением цвета. Подбор необходимого цвета и перевод в различные форматы. Писалась и обрастала функциональностью по мере необходимости, при написании курсового проекта по курсу «Графическое геометрическое моделирование». Имеет подобие экранной лупы.
ASCII — Таблица ASCII кодов с пометкой клавиш. Кодировки Win/DOS. Чтение скен-кодов клавиш при нажатии; единственная клавиша, которая не распознаётся — Tab (но она есть в списке).
Готовый пример чата из книги Сергея Бобровского «Delphi 6 и Kylix».

Чтобы перейти к разделу «Файловый архив» на сайте, нажмите на эту ссылку.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте. Узнать о всех наших друзьях более подробно вы сможете на той же странице.

http://www.sassoft.narod.ru/ — На данном сайте вы сможетt найти разные полезные программы. Также имеется подписка на рассылку и разная полезная информация программисту.

http://www.excode.ru/ — Статьи, исходники, компоненты, книги, кодерский магазин.

http://xskernel.narod.ru/ — XSystem Kernel Project. Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source — наше направление.

http://tpascal.h15.ru/ — Сайт Злобина Евгения Сергеевича «ВСЁ О ПАСКАЛЕ». Здесь найдётся всё: исходники, программы, документация, алгоритмы, олимпиада, конкурсы, форум, уроки и многое, многое другое. Вступайте в сообщество ПаскALL. Сайт постоянно обновляется и развивается.

http://www.hkdsoft.narod.ru/ — H.K.D. Soft — Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase — базу данных по играм содержащую описания, скриншоты, коды, прохождения игр.

http://infomania2004.webhost.ru/ — Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.

http://www.visualbasic.noka.ru/ — Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое!

http://www.sashook.hut1.ru/ — Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты.

http://www.ssgroup.fatal.ru/ — Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое.

Сегодня ничего нет. Давайте просто улыбнёмся.

Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.

Вы можете оказать помощь нашему проекту через систему WebMoney: R379291065219, Z165075684614. Будем очень признательны!

Илон Маск рекомендует:  Asp компонент ad rotator
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL