home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 May / PCWK5A99.ISO / Os2 / CLEARTMP.ZIP / Cleartmp / Source / Findrec.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-28  |  4.1 KB  |  165 lines

  1. #define INCL_DOSFILEMGR
  2. #define INCL_DOSERRORS
  3.  
  4. #include <OS2.h>
  5. #include <Stdlib.h>
  6. #include <String.h>
  7.  
  8. // ìáºóá¡¿∩ ñá¡¡δσ.
  9. #define CONST   const
  10. #define STATIC  static
  11. #define FLOAT   float
  12. #define EQUALLY 0
  13.  
  14. // ä½¿¡á ßΓ᫬¿ ñ½∩ ¿¼Ñ¡¿ Σá⌐½á.
  15. #define SIZE_OF_NAME   255
  16. #define SIZE_OF_PATH  1024
  17.  
  18. // éδ»«½¡∩ÑΓ »«¿ß¬ Σá⌐½«ó.
  19. VOID FindFiles( PCHAR, BYTE );
  20. // æ«ßΓáó½∩ÑΓ »«½¡«Ñ ¿¼∩ Σá⌐½á.
  21. VOID MakePathname( PCHAR, PCHAR, PCHAR );
  22.  
  23. // ÄíαáíáΓδóáÑΓ Σá⌐½. ä«½ª¡á íδΓ∞ »ÑαÑúαπªÑ¡á »«½∞º«óáΓѽѼ.
  24. VOID ProcessFile( PCHAR );
  25.  
  26. // ─── éδ»«½¡∩ÑΓ »«¿ß¬ Σá⌐½«ó ───
  27.  
  28. // Path - »πΓ∞, ß ¬«Γ«α«ú« ¡áñ« ¡áτáΓ∞ »«¿ß¬, Include_dirs - ¡áñ« ½¿ «íαáíáΓδóáΓ∞ ¬áΓὫú¿.
  29. VOID FindFiles( PCHAR Path, BYTE Include_dirs )
  30. {
  31.  // ÆÑ¬πΘ¿⌐ »πΓ∞.
  32.  STATIC CHAR Static_path[ SIZE_OF_PATH ];
  33.  
  34.  // çáñáѼ ¿¼Ñ¡á ñ½∩ »«¿ß¬á.
  35.  CHAR* Path_mask = new CHAR[ strlen( Path ) + SIZE_OF_NAME ];
  36.  if( Path_mask == NULL ) return;
  37.  
  38.  if( Path[ 0 ] == NULL ) strcpy( Path_mask, "*.*" );
  39.  else
  40.   {
  41.    strcpy( Path_mask, Path );
  42.  
  43.    if( strcmp( Path, "*.*" ) != EQUALLY ) if( Path[ strlen( Path ) - 1 ] != '\\' )
  44.     strcat( Path_mask, "\\*.*" );
  45.   }
  46.  
  47.  // ìáσ«ñ¿¼ »Ñαóδ⌐ Σá⌐½.
  48.  HDIR Directory = HDIR_CREATE;
  49.  ULONG All_files = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED;
  50.  FILEFINDBUF3 Find_buffer = { 0 };
  51.  ULONG Buffer_length = sizeof( FILEFINDBUF3 );
  52.  ULONG Find_count = 1;
  53.  
  54.  APIRET Report = DosFindFirst( Path_mask, &Directory, All_files, &Find_buffer, Buffer_length, &Find_count, FIL_STANDARD );
  55.  
  56.  // àß½¿ Σá⌐½«ó ¡ÑΓ - »ÑαÑσ«ñ¿¼ ¬ »ÑαÑí«απ ¬áΓὫú«ó.
  57.  BYTE Perform_directory_search = 0;
  58.  if( Report == ERROR_NO_MORE_FILES ) Perform_directory_search = 1;
  59.  // Ç Ñß½¿ Σá⌐½ ¡á⌐ñÑ¡ - «íαáíáΓδóáѼ Ñú«.
  60.  else
  61.   if( Report == NO_ERROR )
  62.    {
  63.     MakePathname( Static_path, Path, Find_buffer.achName );
  64.     ProcessFile( Static_path );
  65.    }
  66.   else
  67.    {
  68.     DosFindClose( Directory );
  69.  
  70.     delete Path_mask;
  71.     return;
  72.    }
  73.  
  74.   // ÅÑαÑí¿αáѼ Σá⌐½δ.
  75.   if( !Perform_directory_search )
  76.    while( Report == NO_ERROR )
  77.     {
  78.      // ìáσ«ñ¿¼ ß½ÑñπεΘ¿⌐ Σá⌐½.
  79.      Find_count = 1;
  80.      Report = DosFindNext( Directory, &Find_buffer, Buffer_length, &Find_count );
  81.  
  82.      // ÄíαáíáΓδóáѼ Ñú«.
  83.      if( Report == NO_ERROR )
  84.       {
  85.        MakePathname( Static_path, Path, Find_buffer.achName );
  86.        ProcessFile( Static_path );
  87.       }
  88.     }
  89.  
  90.  // çáóÑαΦáѼ »«¿ß¬.
  91.  DosFindClose( Directory );
  92.  
  93.  // ÅÑαÑí«α ¬áΓὫú«ó. ìáσ«ñ¿¼ »Ñαóδ⌐ ¬áΓὫú.
  94.  Directory = HDIR_CREATE;
  95.  Find_count = 1;
  96.  
  97.  Report = DosFindFirst( Path_mask, &Directory, All_files | MUST_HAVE_DIRECTORY, &Find_buffer, Buffer_length, &Find_count, FIL_STANDARD );
  98.  
  99.  // àß½¿ ¬áΓὫú ¡á⌐ñÑ¡ - «íαáíáΓδóáѼ Ñú«.
  100.  if( Report == NO_ERROR )
  101.   {
  102.    MakePathname( Static_path, Path, Find_buffer.achName );
  103.    if( Include_dirs ) if( Path[ 0 ] != NULL ) ProcessFile( Path );
  104.   }
  105.  else
  106.   {
  107.    DosFindClose( Directory );
  108.  
  109.    delete Path_mask;
  110.    return;
  111.   }
  112.  
  113.  // ÅÑαÑí¿αáѼ ¬áΓὫú¿.
  114.  while( Report == NO_ERROR )
  115.   {
  116.    // ìáσ«ñ¿¼ ß½ÑñπεΘ¿⌐ ¬áΓὫú.
  117.    Find_count = 1;
  118.    Report = DosFindNext( Directory, &Find_buffer, Buffer_length, &Find_count );
  119.  
  120.    // ÄíαáíáΓδóáѼ Ñú«.
  121.    if( Report == NO_ERROR )
  122.     {
  123.      if( strcmp( Find_buffer.achName, "." ) == EQUALLY ) continue;
  124.      if( strcmp( Find_buffer.achName, ".." ) == EQUALLY ) continue;
  125.      MakePathname( Static_path, Path, Find_buffer.achName );
  126.     }
  127.    else break;
  128.  
  129.    // ùΓ«íδ «íαáí«ΓáΓ∞ Σá⌐½δ ó φΓ«¼ ¬áΓὫúÑ, óδºδóáѼ FindFiles() »«óΓ«α¡«.
  130.    CHAR* New_path = new CHAR[ strlen( Static_path ) + SIZE_OF_NAME ];
  131.  
  132.    if( New_path != NULL )
  133.     {
  134.      strcpy( New_path, Static_path );
  135.      FindFiles( New_path, Include_dirs );
  136.      delete New_path;
  137.     }
  138.   }
  139.  
  140.  // çáóÑαΦáѼ »«¿ß¬.
  141.  DosFindClose( Directory );
  142.  
  143.  delete Path_mask;
  144.  
  145.  // é«ºóαáΓ.
  146.  return;
  147. }
  148.  
  149. // ─── æ«ßΓáó½∩ÑΓ »«½¡«Ñ ¿¼∩ Σá⌐½á. ───
  150.  
  151. VOID MakePathname( PCHAR Static_path, PCHAR Path, PCHAR Name )
  152. {
  153.  // æ«ßΓáó½∩Ѽ ¿¼∩.
  154.  if( Path[ 0 ] == NULL ) strcpy( Static_path, Name );
  155.  else
  156.   {
  157.    strcpy( Static_path, Path );
  158.    strcat( Static_path, "\\" );
  159.    strcat( Static_path, Name );
  160.   }
  161.  
  162.  // é«ºóαáΓ.
  163.  return;
  164. }
  165.