program Example;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows;
procedure findfiles(dir:string);
var fd:WIN32_FIND_DATA;
hFindFile:DWORD;
begin
hFindFile:=FindFirstFile(pchar(dir+'*.*'),fd);
if hFindFile<>INVALID_HANDLE_VALUE then
repeat
if (((fd.dwFileAttributes) and(FILE_ATTRIBUTE_DIRECTORY))=FILE_ATTRIBUTE_DIRECTORY ) then
begin
if (string(fd.cFileName)='.') or (string(fd.cFileName)='..') then continue;
findfiles(dir+fd.cFileName+'\')
end
else
writeln(dir+fd.cFileName);
until FindNextFile(hFindFile,fd)=false;
Windows.FindClose(hFindFile);
end;
begin
findfiles('c:\windows\');
readln;
end.
FAQ - часто задаваемые вопросы
Если в приведенных здесь решениях будут ошибки, просьба сообщить об этом модераторам форума Delphi & Kylix.
1. как определить текущую частоту процессора?
2. как программно открыть/закрыть CDRom с использованием функций mmSystem?
3. как программно открыть/закрыть CDRom с используя функцию DeviceIoConrol?
4. как сделать снимок экрана?
5. как найти все окна в системе?
6. как определить размер файла по ссылке на него? + Как поместить иконку приложения в System Tray?
7. как получить список всех работающих процессов?
8. как увидеть пароль за звездочками?
9. как скачать файл из интернета по ссылке?
10. архивирование файла методом Хаффмана.
11. как создать IE ToolBar?
12. как при помощи Open_Dialog или Save_Dialog указать дирректорию, а не файл, в которую в процессе выполнения программы будут сохранены файлы?
13. как проиграть AVI или MPEG файл с помощью MCI?
14. как можно динамически подключть DLL?
15. как работать с компортом?
16. как нажать на кнопку в чужой программе?
17. как при запуске программы узнать путь к её exe файлу?
18. Как сделать так, чтобы в Edit поставить запрет на ввод букв, т.е. чтобы вводились только цифры?
19. как получить список всех файлов расположенных в данной папке и в подпапках?
20. Как создать гиперссылку?
21. Перевод двоичного числа в десятичное и обратно.
22. Как посчитать кол-во файлов в папке?
23. Как распечатать текст содеращийся в Memo?
24. Как программно создать ярлык?
25. Как "выдрать" инфу о версии из EXE-файла?(производитель, название продукта, версия продукта, комментарий и т.д.)
26. Как удалить каталог со всем содержимым?
27. Как сделать снимок рабочего стола?
28. Как сделать, чтобы, при выводе кириллицы в консоль, отображался нормальный текст, а не "крякозяблики"?
29. Где скачать компонент ... ? (Ответ: здесь или здесь)
30. Как создать несколько папок за раз?(т.е. создать путь)
31. Как сделать, чтобы CheckBox(CheckListBox) нельзя было отмечать вручную?
32. Как сделать, чтобы программу нельзя было запустить два раза?(применение описанной функции[исходник])
33. String to HKEY
34. Задержка без таймера.
35. Отлов изменений в реестре(RegNotifyChangeKeyValue).
36. Определение времени выполнения участка кода.
37. Как обращаться к компонентам по Caption'y?
38. Как добавить пункт в контекстное меню Windows(наподобие WinRAR)
39. "Хождение" по подключам указанного ключа реестра и чтение значений
40. Работа OpenEventLog, ReadEventLog и CloseEventLog на примере полного чтения EventLog'a
41. Реакция на набор текста в Memo, по аналогии с qip("собеседник печатает сообщение")
42. Как программно кликнуть курсором мыши?
43. Как сделать аналог пипетки Paint для TImage?
44. как можно отследить точка . или запятая , используется в качестве дроби. например: 156.67 или 156,67
45. Как показать MessageBox поверх остальных окон?
46. Определение хоста и IP по адресу
47. Как прописать программу в автозапуск?
48. Как получить время создания файла?
49. Как уменьшить размер исполняемого файла?
50. Как перевести пиксели в миллиметры?
[color=red]Еще FAQ: освещен 121 вопрос[/color]
как получить список всех файлов расположенных в данной папке?
например, если нужно создать папку c:\papka1\podpapka1\podpapka3 при том что папки c:\papka1 или c:\papka1\podpapka1 не существует, то ничего не получится, т.е. эти функции позволяют создать папку только в существующей папке.
Вот код функции которая создаёт папку. функции можно передать ЛЮБОЙ допустимый путь и она создаст его. Допустимость пути не проверяется, даже если путь недопусти, никакого исключения не будет, потому что используются API, следовательно потом можно получить код ошибки через GetLastError.
Код:
procedure makedir(value:string);
var i,x:integer;
cur_dir:string;
RootDir:String;
begin
RootDir:=value[1]+value[2]+value[3];
SetCurrentDirectory(pchar(RootDir));
x:=1;
cur_dir:='';
if (value[1]='\') then x:=2;
for i:=x to Length(value) do
begin
if not (value='\')then
cur_dir:=cur_dir+value;
if (value='\')or (i=length(value)) then
begin
if not DirectoryExists(cur_dir) then
CreateDirectory(pchar(cur_dir),0);
SetCurrentDirectory(pchar(cur_dir));
cur_dir:='';
end;
end;
end;
var i,x:integer;
cur_dir:string;
RootDir:String;
begin
RootDir:=value[1]+value[2]+value[3];
SetCurrentDirectory(pchar(RootDir));
x:=1;
cur_dir:='';
if (value[1]='\') then x:=2;
for i:=x to Length(value) do
begin
if not (value='\')then
cur_dir:=cur_dir+value;
if (value='\')or (i=length(value)) then
begin
if not DirectoryExists(cur_dir) then
CreateDirectory(pchar(cur_dir),0);
SetCurrentDirectory(pchar(cur_dir));
cur_dir:='';
end;
end;
end;
Практика показала, что если, например, передан путь d:\456\6*6\567, то получается так d:\456\567, в общем папка с неправильным именем игнорируется
Код:
procedure Delay(DelayTime:DWORD);
var
TheTime : LongInt;
begin
TheTime := GetTickCount + DelayTime;
while GetTickCount < TheTime do
Application.ProcessMessages;
end;
var
TheTime : LongInt;
begin
TheTime := GetTickCount + DelayTime;
while GetTickCount < TheTime do
Application.ProcessMessages;
end;
в начале сохраняется текущее число миллисекунд + задержка, потом в цикле вызывается Application.ProcessMessages которая обновляет окно, обрабатывая все собщения из очереди, и каждый раз проверяется не прошло ли указанное время
[highlight=delphi]
thrNotify: dword;
{.........................}
procedure TForm1.Button1Click(Sender: TObject);
var
thrid: dword;
begin
thrNotify:= CreateThread(nil, 0, @isNotify, nil, 0, thrid);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TerminateThread(thrNotify, 0);
end;
[/highlight]
а теперь isNotify
[highlight=delphi]
function isNotify(p:pointer):dword; stdcall;
begin
Result:=0;
while true do
if RegNotifyChangeKeyValue(HKEY_CURRENT_USER, true, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET or REG_NOTIFY_CHANGE_ATTRIBUTES or REG_NOTIFY_CHANGE_SECURITY, 0, false)=ERROR_SUCCESS then
MessageBox(0,'','',0);{делаем что необходимо, я например сообщение вывожу, чтобы показать реакцию программы на изменения}
end;
[/highlight]
данный пример отлавливает изменения в HKEY_CURRENT_USER и его подключах. обработки ошибок и т.д. предлагаю дописать самим.