dirent_nt.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <config.h>
  2. /* glib provides a replacement for MSVC */
  3. #ifndef _MSC_VER
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <errno.h>
  8. #include "../src/global.h"
  9. DIR *opendir (const char * a_dir)
  10. {
  11. int err;
  12. WIN32_FIND_DATA wfd;
  13. DIR* dd_dir = (DIR*) malloc (sizeof(DIR));
  14. char *c_dir = malloc (strlen(a_dir) + 4);
  15. strcpy (c_dir, a_dir);
  16. strcat (c_dir, "\\*");
  17. dd_dir->d_handle = FindFirstFile (c_dir, &wfd);
  18. if (dd_dir->d_handle == INVALID_HANDLE_VALUE) {
  19. err = GetLastError();
  20. switch (err) {
  21. case ERROR_NO_MORE_FILES:
  22. case ERROR_FILE_NOT_FOUND:
  23. case ERROR_PATH_NOT_FOUND:
  24. errno = ENOENT;
  25. break;
  26. case ERROR_NOT_ENOUGH_MEMORY:
  27. errno = ENOMEM;
  28. break;
  29. default:
  30. errno = EINVAL;
  31. break;
  32. }
  33. free(dd_dir);
  34. return NULL;
  35. }
  36. dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
  37. ? 0 : wfd.dwFileAttributes;
  38. dd_dir->d_time = dd_dir->d_date = 10;
  39. dd_dir->d_size = wfd.nFileSizeLow;
  40. strcpy (dd_dir->d_name, wfd.cFileName);
  41. dd_dir->d_first = 1;
  42. free (c_dir);
  43. return dd_dir;
  44. }
  45. DIR *readdir( DIR * dd_dir)
  46. {
  47. int err;
  48. WIN32_FIND_DATA wfd;
  49. if (dd_dir->d_first) {
  50. dd_dir->d_first = 0;
  51. return dd_dir;
  52. }
  53. if(!FindNextFile (dd_dir->d_handle, &wfd)) {
  54. err = GetLastError();
  55. switch (err) {
  56. case ERROR_NO_MORE_FILES:
  57. case ERROR_FILE_NOT_FOUND:
  58. case ERROR_PATH_NOT_FOUND:
  59. errno = ENOENT;
  60. break;
  61. case ERROR_NOT_ENOUGH_MEMORY:
  62. errno = ENOMEM;
  63. break;
  64. default:
  65. errno = EINVAL;
  66. break;
  67. }
  68. return NULL;
  69. }
  70. dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
  71. ? 0 : wfd.dwFileAttributes;
  72. dd_dir->d_time = dd_dir->d_date = 10;
  73. dd_dir->d_size = wfd.nFileSizeLow;
  74. strcpy (dd_dir->d_name, wfd.cFileName);
  75. return dd_dir;
  76. }
  77. int closedir (DIR *dd_dir)
  78. {
  79. FindClose(dd_dir->d_handle);
  80. free (dd_dir);
  81. return 1;
  82. }
  83. #endif /* _MSC_VER */