Глава 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.