Глава 11. Функции________________________________________267
3 #include <dos.h>
4 #include <dir.h>
5 //В главе 14 описывается способ сканирования файлов //в каталоге.
6 // Алгоритм просмотра может быть использован снова // просто передачей другого функтора.
7 void TraverseDirectory( const char* path, void (*Functor)( struct &ffblk &ffblk))
8 {
9 struct ffblk ffblk;
10: ^ int done;
11: done = findfirstf path, &ffblk, 0) ;
12: while( idone)-
13: {
14: Functor( ffblk); // Здесь можно варьировать
// производимые над файлами
// действия.
15 done = findnext( &ffblk) ;
16 } ' •
17 }
18 // Эта функция выводит форматированный список файлов в каталоге
19 void ListFilesf struct ffblk &ffblk)
20 {
21 • cout « ffblk.ff_name « endl;
22 }
23 unsigned long fileSum = 0;
24 // Эта функция суммирует размер файлов.
25 void SumAllFiles( struct ffblk &ffblk)
26 ( . .
27 fileSum += ffblk.ff_fsize;
28 )
29 void main()
30 {
31 TraverseDirectory( "C:\\*.*", ListFiles);
32 cout « "Общий объем, занятый на С:\\*.*: ";
33 TraverseDirectory ( "C:\\*.*", SuinAllFiles) ;
34 cout « fiieSum « endl;
35 }
Строка 7 содержит интерфейс функции, просматривающей каталог, заданный параметром path. Функция принимает функтор (указатель на функцию), объявленный следующим образом:
void FunctionName( struct ffblk &ffblk);
Функции TraverseDirectory может быть передан указатель на любую функцию такого вида (две таких функции приведены в листинге). TraverseDirectory проверяет каждый файл, соответствующий маске, заданной в параметре
path.