home *** CD-ROM | disk | FTP | other *** search
- #define INCL_DOSFILEMGR
- #define INCL_DOSERRORS
-
- #include <OS2.h>
- #include <Stdlib.h>
- #include <String.h>
-
- // ìáºóá¡¿∩ ñá¡¡δσ.
- #define CONST const
- #define STATIC static
- #define FLOAT float
- #define EQUALLY 0
-
- // 使¡á ßΓ᫬¿ ñ½∩ ¿¼Ñ¡¿ Σá⌐½á.
- #define SIZE_OF_NAME 255
- #define SIZE_OF_PATH 1024
-
- // éδ»«½¡∩ÑΓ »«¿ß¬ Σá⌐½«ó.
- VOID FindFiles( PCHAR, BYTE );
- // æ«ßΓáó½∩ÑΓ »«½¡«Ñ ¿¼∩ Σá⌐½á.
- VOID MakePathname( PCHAR, PCHAR, PCHAR );
-
- // ÄíαáíáΓδóáÑΓ Σá⌐½. 䫽ª¡á íδΓ∞ »ÑαÑúαπªÑ¡á »«½∞º«óáΓѽѼ.
- VOID ProcessFile( PCHAR );
-
- // ─── éδ»«½¡∩ÑΓ »«¿ß¬ Σá⌐½«ó ───
-
- // Path - »πΓ∞, ß ¬«Γ«α«ú« ¡áñ« ¡áτáΓ∞ »«¿ß¬, Include_dirs - ¡áñ« ½¿ «íαáíáΓδóáΓ∞ ¬áΓὫú¿.
- VOID FindFiles( PCHAR Path, BYTE Include_dirs )
- {
- // ÆÑ¬πΘ¿⌐ »πΓ∞.
- STATIC CHAR Static_path[ SIZE_OF_PATH ];
-
- // çáñáѼ ¿¼Ñ¡á ñ½∩ »«¿ß¬á.
- CHAR* Path_mask = new CHAR[ strlen( Path ) + SIZE_OF_NAME ];
- if( Path_mask == NULL ) return;
-
- if( Path[ 0 ] == NULL ) strcpy( Path_mask, "*.*" );
- else
- {
- strcpy( Path_mask, Path );
-
- if( strcmp( Path, "*.*" ) != EQUALLY ) if( Path[ strlen( Path ) - 1 ] != '\\' )
- strcat( Path_mask, "\\*.*" );
- }
-
- // ìáσ«ñ¿¼ »Ñαóδ⌐ Σá⌐½.
- HDIR Directory = HDIR_CREATE;
- ULONG All_files = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED;
- FILEFINDBUF3 Find_buffer = { 0 };
- ULONG Buffer_length = sizeof( FILEFINDBUF3 );
- ULONG Find_count = 1;
-
- APIRET Report = DosFindFirst( Path_mask, &Directory, All_files, &Find_buffer, Buffer_length, &Find_count, FIL_STANDARD );
-
- // àß½¿ Σá⌐½«ó ¡ÑΓ - »ÑαÑσ«ñ¿¼ ¬ »ÑαÑí«απ ¬áΓὫú«ó.
- BYTE Perform_directory_search = 0;
- if( Report == ERROR_NO_MORE_FILES ) Perform_directory_search = 1;
- // Ç Ñß½¿ Σá⌐½ ¡á⌐ñÑ¡ - «íαáíáΓδóáѼ Ñú«.
- else
- if( Report == NO_ERROR )
- {
- MakePathname( Static_path, Path, Find_buffer.achName );
- ProcessFile( Static_path );
- }
- else
- {
- DosFindClose( Directory );
-
- delete Path_mask;
- return;
- }
-
- // ÅÑαÑí¿αáѼ Σá⌐½δ.
- if( !Perform_directory_search )
- while( Report == NO_ERROR )
- {
- // ìáσ«ñ¿¼ ß½ÑñπεΘ¿⌐ Σá⌐½.
- Find_count = 1;
- Report = DosFindNext( Directory, &Find_buffer, Buffer_length, &Find_count );
-
- // ÄíαáíáΓδóáѼ Ñú«.
- if( Report == NO_ERROR )
- {
- MakePathname( Static_path, Path, Find_buffer.achName );
- ProcessFile( Static_path );
- }
- }
-
- // çáóÑαΦáѼ »«¿ß¬.
- DosFindClose( Directory );
-
- // ÅÑαÑí«α ¬áΓὫú«ó. ìáσ«ñ¿¼ »Ñαóδ⌐ ¬áΓὫú.
- Directory = HDIR_CREATE;
- Find_count = 1;
-
- Report = DosFindFirst( Path_mask, &Directory, All_files | MUST_HAVE_DIRECTORY, &Find_buffer, Buffer_length, &Find_count, FIL_STANDARD );
-
- // àß½¿ ¬áΓὫú ¡á⌐ñÑ¡ - «íαáíáΓδóáѼ Ñú«.
- if( Report == NO_ERROR )
- {
- MakePathname( Static_path, Path, Find_buffer.achName );
- if( Include_dirs ) if( Path[ 0 ] != NULL ) ProcessFile( Path );
- }
- else
- {
- DosFindClose( Directory );
-
- delete Path_mask;
- return;
- }
-
- // ÅÑαÑí¿αáѼ ¬áΓὫú¿.
- while( Report == NO_ERROR )
- {
- // ìáσ«ñ¿¼ ß½ÑñπεΘ¿⌐ ¬áΓὫú.
- Find_count = 1;
- Report = DosFindNext( Directory, &Find_buffer, Buffer_length, &Find_count );
-
- // ÄíαáíáΓδóáѼ Ñú«.
- if( Report == NO_ERROR )
- {
- if( strcmp( Find_buffer.achName, "." ) == EQUALLY ) continue;
- if( strcmp( Find_buffer.achName, ".." ) == EQUALLY ) continue;
- MakePathname( Static_path, Path, Find_buffer.achName );
- }
- else break;
-
- // ùΓ«íδ «íαáí«ΓáΓ∞ Σá⌐½δ ó φΓ«¼ ¬áΓὫúÑ, óδºδóáѼ FindFiles() »«óΓ«α¡«.
- CHAR* New_path = new CHAR[ strlen( Static_path ) + SIZE_OF_NAME ];
-
- if( New_path != NULL )
- {
- strcpy( New_path, Static_path );
- FindFiles( New_path, Include_dirs );
- delete New_path;
- }
- }
-
- // çáóÑαΦáѼ »«¿ß¬.
- DosFindClose( Directory );
-
- delete Path_mask;
-
- // 髺óαáΓ.
- return;
- }
-
- // ─── æ«ßΓáó½∩ÑΓ »«½¡«Ñ ¿¼∩ Σá⌐½á. ───
-
- VOID MakePathname( PCHAR Static_path, PCHAR Path, PCHAR Name )
- {
- // æ«ßΓáó½∩Ѽ ¿¼∩.
- if( Path[ 0 ] == NULL ) strcpy( Static_path, Name );
- else
- {
- strcpy( Static_path, Path );
- strcat( Static_path, "\\" );
- strcat( Static_path, Name );
- }
-
- // 髺óαáΓ.
- return;
- }
-