filefind.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:6k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /*
  2.  Copyright (C) 1996 Mike White
  3.  Permission is granted to any individual or institution to use, copy, or
  4.  redistribute this software so long as all of the original files are included,
  5.  that it is not sold for profit, and that this copyright notice is retained.
  6. */
  7. #include <windows.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <time.h>
  12. #include <ctype.h>
  13. #include <io.h>
  14. #include <dos.h>
  15. #ifndef __BORLANDC__
  16. #include <direct.h>
  17. #else
  18. #include <dir.h>
  19. #endif
  20. #include <process.h>
  21. #include <commdlg.h>
  22. #include "wiz.h"
  23. /*
  24.  * FindFile - find files matching a pattern files on specified drives
  25.  * parameters:
  26.  *            drives   - An array of drive letters to search.
  27.  *            pattern  - A file name pattern.
  28.  */
  29. void FindFile(char far *drives, char *pattern, HWND hDlg)
  30. {
  31. char tree[] = "Z:";
  32. /* Process all selected drives. Not truly necessary for current usage, but
  33.    retained for potential future use as file finder, grep etc.
  34.  */
  35. while (*drives)
  36.    {
  37.    tree[0] = *drives++;
  38.    if (lstrrchr(pattern, '\') != NULL)
  39.       {
  40.       char str[80], *p;
  41.       lstrcpy(str, pattern);
  42.       p = lstrrchr(str, '\');
  43.       str[(int)(p-str)] = '';
  44.       p = lstrrchr(pattern, '\');
  45.       p++;
  46.       lstrcpy(pattern, p);
  47.       DoADir(str, "*.*", pattern, hDlg, tree[0]);
  48.       }
  49.    else
  50.       DoADir(tree, "*.*", pattern, hDlg, tree[0]);
  51.     }
  52. }
  53. /*
  54.  * DoADir - search a directory for files matching a file name pattern
  55.  *          recursivly search sub directories
  56.  * parameters:
  57.  *             patternp  - A path to search.
  58.  *             patternn  - A file name pattern to use to find directories.
  59.  *             include   - A file name pattern to use to select files.
  60.  *             hDlg      - handle to the count dialog window
  61.  *             drive     - Drive letter to search on
  62.  */
  63. void DoADir(char *patternp, char *patternn,
  64.    char *include, HWND hDlg, char drive)
  65. {
  66. char  patternw[PATH_MAX],npatternp[PATH_MAX];
  67. BOOL  have_subs, included_files;
  68. #ifndef WIN32
  69. struct find_t fileinfo;
  70. #else
  71. HANDLE hFoundFile;
  72. WIN32_FIND_DATA fileinfo;
  73. #endif
  74. lstrcpy(patternw, patternp);
  75. if (patternp[lstrlen(patternw)-1] != '\')
  76.    lstrcat(patternw, "\");
  77. lstrcat(patternw, patternn);
  78. have_subs = FALSE;
  79. #ifndef WIN32
  80. if (!_dos_findfirst(patternw, _A_SUBDIR, &fileinfo))
  81. #else
  82. if ((hFoundFile = FindFirstFile(patternw, &fileinfo)) != INVALID_HANDLE_VALUE)
  83. #endif
  84.    {
  85.    included_files = FALSE;
  86.    do
  87.       {
  88. #ifndef WIN32
  89.       if (fileinfo.attrib & _A_SUBDIR)  /* subdirectory */
  90.          {
  91.          if (fileinfo.name[0] != '.')   /* ignore . and .. */
  92.             have_subs = TRUE;
  93.          }
  94.        else                             /* file */
  95.          {
  96.          if (FnMatch(include, fileinfo.name))
  97. #else
  98.       if (fileinfo.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)  /* subdirectory */
  99.          {
  100.          if (fileinfo.cFileName[0] != '.')  /* ignore . and .. */
  101.             have_subs = TRUE;
  102.          }
  103.        else                                 /* file */
  104.          {
  105.          if (FnMatch(include, fileinfo.cFileName))
  106. #endif
  107.             {
  108.             char buf[PATH_MAX];
  109.             /* If hDlg == NULL, then we got here from the Search
  110.                Archive menu item.
  111.              */
  112.             if ((!included_files) && (hDlg != NULL))
  113.                {
  114.                buf[0] = drive;
  115.                buf[1] = ':';
  116.                buf[2] = '';
  117.                lstrcat(buf, patternp);
  118.                if (buf[lstrlen(buf)-1] != '\')
  119.                   lstrcat(buf, "\");
  120.                lstrcat(buf, include);
  121.                included_files = TRUE;
  122.                SendMessage(GetDlgItem(hDlg, IDC_FILE_LIST),
  123.                      LB_INSERTSTRING, 0, (LONG) ((LPSTR) buf));
  124.                }
  125.             else if(hDlg == NULL)
  126.                {
  127.                buf[0] = drive;
  128.                buf[1] = ':';
  129.                buf[2] = '';
  130.                lstrcat(buf, patternp);
  131.                if (buf[lstrlen(buf)-1] != '\')
  132.                   lstrcat(buf, "\");
  133. #ifdef WIN32
  134.                lstrcat(buf, fileinfo.cFileName);
  135. #else
  136.                lstrcat(buf, fileinfo.name);
  137. #endif
  138.                SearchArchive(buf);
  139.                }
  140.             }
  141.          }
  142. #ifndef WIN32
  143.       } while (!_dos_findnext(&fileinfo));
  144. #else
  145.       } while (FindNextFile(hFoundFile, &fileinfo));
  146.    FindClose(hFoundFile);
  147. #endif
  148.    }
  149. if (have_subs)
  150.    {
  151. #ifndef WIN32
  152.    if (!_dos_findfirst(patternw, _A_SUBDIR, &fileinfo))
  153. #else
  154.    if ((hFoundFile = FindFirstFile(patternw, &fileinfo)) != INVALID_HANDLE_VALUE)
  155. #endif
  156.       {
  157.       do
  158.          {
  159. #ifndef WIN32
  160.          if (fileinfo.attrib & _A_SUBDIR)  /* subdirectory */
  161.             {
  162.             if (fileinfo.name[0] != '.')   /* ignore . and .. */
  163. #else
  164.       if (fileinfo.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)  /* subdirectory */
  165.             {
  166.             if (fileinfo.cFileName[0] != '.')  /* ignore . and .. */
  167. #endif
  168.                {
  169.                lstrcpy(npatternp, patternp);
  170.                if (patternp[lstrlen(npatternp)-1] != '\')
  171.                   lstrcat(npatternp, "\");
  172. #ifndef WIN32
  173.                lstrcat(npatternp, fileinfo.name);
  174. #else
  175.                lstrcat(npatternp, fileinfo.cFileName);
  176. #endif
  177.                DoADir(npatternp, patternn, include, hDlg, drive);
  178.                }
  179.             }
  180. #ifndef WIN32
  181.          } while (!_dos_findnext(&fileinfo));
  182. #else
  183.          } while (FindNextFile(hFoundFile, &fileinfo));
  184.       FindClose(hFoundFile);
  185. #endif
  186.       }
  187.    }
  188. }
  189. /*
  190.  *FnMatch - test if a file name matches a file name pattern.
  191.  *           handles * and ? wildcard characters.
  192.  * parameters:
  193.  *             pat   - A file name pattern (ie. xyz?.*)
  194.  *             name  - A file name to test against pat (ie. xyz1.c)
  195.  * returns:
  196.  *             1 - if name_match
  197.  *             0 - if not a name_match
  198.  */
  199. BOOL FnMatch(char *pat, char *name)
  200. {
  201. BOOL name_match = TRUE, ndone = TRUE;
  202. char *cpp, *cpn;
  203. cpp = pat;
  204. cpn = name;
  205. while (ndone)
  206.    {
  207.    switch (*cpp)
  208.       {
  209.       case '*':
  210.          /* skip to . or end of pat */
  211.          while (*cpp && *cpp != '.')
  212.             cpp++;
  213.          /* skip to . or end of name */
  214.          while (*cpn && *cpn != '.')
  215.             cpn++;
  216.          break;
  217.       case '?':
  218.          cpp++;
  219.          cpn++;
  220.          break;
  221.       case 0:
  222.          if (*cpn != 0)
  223.             name_match = FALSE;
  224.          ndone = FALSE;
  225.          break;
  226.       default:
  227.          if (tolower(*cpp) == tolower(*cpn))
  228.             {
  229.             cpp++;
  230.             cpn++;
  231.             }
  232.          else
  233.             {
  234.             name_match = FALSE;
  235.             ndone = FALSE;
  236.             }
  237.          break;
  238.       }
  239.    }
  240. return(name_match);
  241. }