dirent32.h
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.     Win32 lacks unix dirent support.  But, we can fake it.  Many
  3.     thanks to Dave Lubrik (lubrik@jaka.ece.uiuc.edu) who found and
  4.     fixed many bugs in the original code.
  5.  */
  6. #ifndef _WIN32
  7. #include <dirent.h>
  8. #else
  9. #include <windows.h>
  10. struct dirent {
  11.     char           d_name[MAX_PATH]; 
  12. };
  13. typedef struct {
  14.     WIN32_FIND_DATA  wfd;
  15.     HANDLE           hFind;
  16.     struct dirent    de;
  17. } DIR;
  18. static DIR *
  19. opendir(char *pSpec)
  20. {
  21.   DIR *pDir = malloc(sizeof(DIR));
  22.   char pathnamespec[MAX_PATH];
  23.   int l; /* length of directory specifier */
  24.   char c; /* last char of directory specifier */
  25.   /* Given a directory pathname in pSpec, add  (if necessary) and *
  26.      to yield a globbable expression describing all the files in that
  27.      directory */
  28.   strcpy(pathnamespec, pSpec);
  29.   /* Add a  to separate the directory name from the filename-wildcard
  30.      "*", unless it already ends in a  (don't create \ sequences),
  31.      or it is a drivespec (since "C:*" differs in meaning from "C:*") */
  32.   if (((l = strlen(pSpec)) > 0) && ((c = pSpec[l-1]) != '\') && (c != ':'))
  33.     strcat(pathnamespec, "\");
  34.   /* Add the filename wildcard "*" */
  35.   strcat(pathnamespec,"*");
  36.   /* Find files matching that expression (all the files in that
  37.      directory) */
  38.   pDir->hFind = FindFirstFile(pathnamespec, &pDir->wfd);
  39.   return pDir;
  40. }
  41. /* closedir takes a pointer to a DIR structure created by opendir, and
  42.    frees up resources allocated by opendir. Call it when done with a
  43.    directory. */
  44. static void
  45. closedir(DIR * pDir)
  46. {
  47.     FindClose(pDir->hFind); /* Release system resources */
  48.     free(pDir); /* release memory */
  49. }
  50. /* readdir is used to iterate through the files in a directory.  It
  51.    takes a pointer to a DIR structure created by opendir, and each
  52.    time it is called it returns the name of another file in the
  53.    directory passed to opendir.  Returns: a pointer to a dirent
  54.    structure, containing the file name.  NULL if there are no more
  55.    files in the directory. */
  56. static struct dirent *
  57. readdir(DIR *pDir)
  58. {
  59.     /* The previous call to opendir or readdir has already found the next
  60.            file (using FindFirstFile or FindNextFile respectively).  Return
  61.            that file name to the caller, and silently find the next one. */
  62.     if (*(pDir->wfd.cFileName)) { /* If we haven't exhausted the files */
  63. strcpy(pDir->de.d_name, pDir->wfd.cFileName); /* copy name */
  64. if (!FindNextFile(pDir->hFind, &pDir->wfd)) /* get next */
  65.     *(pDir->wfd.cFileName) = 0;
  66. /* if no more, zero next filename, so that next time through,
  67.    we don't even try. */
  68. return &pDir->de; /* return dirent struct w/filename */
  69.     }
  70.     return NULL;            /* No more files to find. */
  71. }
  72. #endif