large_dir_read.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #define _GNU_SOURCE
  2. #include <dirent.h>
  3. #include <err.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <unistd.h>
  12. unsigned int FILES_NO = 10000;
  13. int main(int argc, char *argv[]) {
  14. int fd = 0, ret = 0;
  15. char name[0x10] = { 0 };
  16. DIR* dir = NULL;
  17. struct dirent* x = NULL;
  18. unsigned long i, count = 0;
  19. char* tmp_name = NULL;
  20. char* old_wd = NULL;
  21. setbuf(stdout, NULL);
  22. setbuf(stderr, NULL);
  23. if (argc != 2 && argc != 3) {
  24. fprintf(stderr, "Usage: %s tmp_folder_name [files_count]\n", argv[0]);
  25. return 1;
  26. }
  27. tmp_name = argv[1];
  28. if (argc > 2) {
  29. FILES_NO = atol(argv[2]);
  30. }
  31. if ((old_wd = get_current_dir_name()) == NULL) {
  32. err(1, "getcwd");
  33. }
  34. if (mkdir(tmp_name, S_IRWXU | S_IRWXG | S_IRWXO) < 0 || chdir(tmp_name) < 0) {
  35. err(1, "mkdir & chdr");
  36. }
  37. for (i = 0; i < FILES_NO; ++i) {
  38. sprintf(name, "%010lu", i);
  39. fd = open(name, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO);
  40. if (fd < 0) {
  41. fprintf(stderr, "cannot create file %lu\n", i);
  42. ret = 1;
  43. goto cleanup;
  44. }
  45. if (close(fd) < 0) {
  46. fprintf(stderr, "close failed with: %s\n", strerror(errno));
  47. }
  48. }
  49. dir = opendir(".");
  50. if (!dir) {
  51. fputs("cannot open \".\"", stderr);
  52. ret = 1;
  53. goto cleanup;
  54. }
  55. while (1) {
  56. errno = 0;
  57. x = readdir(dir);
  58. if (!x) {
  59. if (errno != 0) {
  60. fprintf(stderr, "error: readdir: %s\n", strerror(errno));
  61. ret = 1;
  62. goto cleanup;
  63. } else {
  64. break;
  65. }
  66. }
  67. count++;
  68. }
  69. printf("count: %lu\n", count);
  70. cleanup:
  71. if (dir) {
  72. closedir(dir);
  73. }
  74. for (i = 0; i < FILES_NO; ++i) {
  75. sprintf(name, "%010lu", i);
  76. unlink(name);
  77. }
  78. if (chdir(old_wd) < 0) {
  79. fprintf(stderr, "could not change directory to original (%s): %s\n", old_wd, strerror(errno));
  80. }
  81. free(old_wd);
  82. rmdir(tmp_name);
  83. return ret;
  84. }