dirent.c 1.8 KB

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