当前位置:   article > 正文

基于Linux使用C语言实现简单的目录管理

基于Linux使用C语言实现简单的目录管理

在Linux下,需要实现某个目录下文件的遍历的时候,可以使用opendir,readdir,closedir这些接口。这些接口使用说明如下所示:

1).opendir

DIR* opendir(const char * name);  

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

传入name路径,成功则返回非空DIR指针,否则返回NULL; 注意DIR前面没有struct,如果加上编译器会warning。

2).readdir

struct dirent *readdir(struct DIR* dir);  

readdir一般要配合opendir使用,readdir不是线程安全函数,代替他的有readdir_r。

readdir返回 struct dirent *指针,读完目录下所有文件时,返回NULL。

3).closedir

void closedir(DIR* dir);   关闭打开的目录描述符dir,同时释放dir空间。Closedir需要配合opendir使用。

下面简单记录下这些接口的使用例子,主要涉及文件遍历,文件查找,文件模糊查找,文件删除,关键字查找并删除等功能。

1.首先在Linux系统下,在这里创建一个命名为"proj"测试的工程。

2.创建一个名为“dirtest.c”的源文件,粘贴如下所示的内容:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <stdarg.h>
  4. #include <sys/types.h>
  5. #include <dirent.h>
  6. #include<string.h>
  7. //定义一些文件操作的宏
  8. #define MODE_LIST_ALL_FILE 0 //列出所有文件
  9. #define MODE_FIND_FILE 1 //查找一个文件
  10. #define MODE_DELETE_FILE 2 //删除一个文件
  11. #define MODE_FUZZY_SEARCH_FILE 3 //通过关键字匹配查找文件
  12. #define MODE_FUZZY_SEARCH_DELETE_FILE 4 //通过关键字匹配查找并删除文件
  13. /*
  14. 函数功能:列出该目录下的所有文件
  15. */
  16. void list_all_files(DIR *dir)
  17. {
  18. int index=0;
  19. struct dirent *d;
  20. while ((d = readdir(dir)) != NULL)
  21. {
  22. index++;
  23. LOG("[index %d]:%s\n", index, d->d_name);
  24. }
  25. }
  26. /*
  27. 函数功能:查找文件
  28. 返回:1,成功找到;0:未找到文件
  29. */
  30. int find_files(DIR *dir, char *file)
  31. {
  32. struct dirent *d;
  33. int find = 0;
  34. while ((d = readdir(dir)) != NULL)
  35. {
  36. //如果名称匹配上,则打印出该文件名称提示
  37. if(!strcmp(d->d_name, file)) {
  38. LOG("Locate the file named%s\n", d->d_name);
  39. find = 1;//返回结果置1
  40. }
  41. }
  42. return find;
  43. }
  44. /*
  45. 函数功能:通过关键字匹配查找文件
  46. 返回:1,成功找到;0:未找到文件
  47. */
  48. int fuzzy_search_files(DIR *dir, char *keyword)
  49. {
  50. struct dirent *d;
  51. int find = 0;
  52. while ((d = readdir(dir)) != NULL)
  53. {
  54. //如果名称匹配上,则打印出该文件名称提示
  55. if(strstr(d->d_name, keyword)) {
  56. LOG("file :%s match!!!\n", d->d_name);
  57. find = 1;//返回结果置1
  58. }
  59. }
  60. return find;
  61. }
  62. /*
  63. 函数功能:删除一个文件
  64. 返回:1,成功找到,并删除该文件;0:未找到文件
  65. */
  66. int delete_files(DIR *dir, char *test_dir, char *file)
  67. {
  68. struct dirent *d;
  69. int find = 0;
  70. while ((d = readdir(dir)) != NULL)
  71. {
  72. if(!strcmp(d->d_name, file)) {
  73. char delete_file[64]="";
  74. sprintf(delete_file, "%s/%s", test_dir, file);//需要将路径+文件名才能正确删除
  75. unlink(delete_file);
  76. LOG("delete file:%s success!\n", delete_file);
  77. find = 1;
  78. }
  79. }
  80. return find;
  81. }
  82. /*
  83. 函数功能:删除通过关键字匹配上的文件
  84. 返回:1,成功找到,并删除该文件;0:未找到文件
  85. */
  86. int delete_files_by_keyword(DIR *dir, char *test_dir, char *keyword)
  87. {
  88. struct dirent *d;
  89. int find = 0;
  90. while ((d = readdir(dir)) != NULL)
  91. {
  92. if(strstr(d->d_name, keyword)) {
  93. char delete_file[64]="";
  94. sprintf(delete_file, "%s/%s", test_dir, d->d_name);//需要将路径+文件名才能正确删除
  95. unlink(delete_file);
  96. LOG("delete file:%s success!\n", delete_file);
  97. find = 1;
  98. }
  99. }
  100. return find;
  101. }
  102. /*
  103. 函数功能:接收并解析命令行输入的参数
  104. 返回:无
  105. */
  106. void dir_proc(char *argv[])
  107. {
  108. char *dir_name = argv[1];
  109. int cmd_code = atoi(argv[2]);
  110. DIR *dir;
  111. struct dirent *d;
  112. dir = opendir(dir_name);
  113. if (!dir)
  114. {
  115. LOG("cannot open dir %s", dir_name);
  116. return ;
  117. }
  118. //根据代号,作出不同的操作
  119. switch(cmd_code) {
  120. case MODE_LIST_ALL_FILE:
  121. {
  122. //显示该目录下的所有文件
  123. list_all_files(dir);
  124. break;
  125. }
  126. case MODE_FIND_FILE:
  127. {
  128. //查找文件
  129. if(argv[3]) {
  130. if(!find_files(dir,argv[3])) {
  131. LOG("file name %s not found!\n", argv[3]);
  132. }
  133. }
  134. else {
  135. show_help();
  136. }
  137. break;
  138. }
  139. case MODE_DELETE_FILE:
  140. {
  141. //删除文件
  142. if(argv[3]) {
  143. if(!delete_files(dir,argv[1], argv[3])) {
  144. LOG("file name %s not found!delete fail\n", argv[3]);
  145. }
  146. }
  147. else {
  148. show_help();
  149. }
  150. break;
  151. }
  152. case MODE_FUZZY_SEARCH_FILE:
  153. {
  154. //通过关键字查找文件
  155. if(argv[3]) {
  156. if(!fuzzy_search_files(dir, argv[3])) {
  157. LOG("file name search by keywords %s fail!\n", argv[3]);
  158. }
  159. }
  160. else {
  161. show_help();
  162. }
  163. break;
  164. }
  165. case MODE_FUZZY_SEARCH_DELETE_FILE:
  166. {
  167. //通过关键字查找,并删除文件
  168. if(argv[3]) {
  169. if(!delete_files_by_keyword(dir,argv[1], argv[3])) {
  170. LOG("file name search by keywords %s fail!\n", argv[3]);
  171. }
  172. }
  173. else {
  174. show_help();
  175. }
  176. break;
  177. }
  178. default:
  179. {
  180. LOG("command unkown!\n");
  181. break;
  182. }
  183. }
  184. closedir(dir);
  185. }

 3.创建一个名为”main.c”的文件,内容如下所示:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <stdarg.h>
  4. #include <sys/types.h>
  5. #include <dirent.h>
  6. #include<string.h>
  7. /*
  8. 函数功能:日志打印
  9. */
  10. void LOG(const char *format,...)
  11. {
  12. va_list argptr;
  13. char buffer[2048];
  14. va_start(argptr,format);
  15. vsprintf(buffer,format,argptr);
  16. va_end(argptr);
  17. printf("%s", buffer);
  18. }
  19. /*
  20. 函数功能:显示菜单选项
  21. */
  22. void show_help()
  23. {
  24. LOG("Invalid parameter!\n");
  25. LOG("-h:Show help\n");
  26. LOG("0:List all files\n");
  27. LOG("1:Find a file, (for example: ./dirtest test_dir 1 a.txt)\n");
  28. LOG("2:Delete a file, (for example: ./dirtest test_dir 2 a.txt)\n");
  29. LOG("3:Fuzzy find file, (for example: ./dirtest test_dir 3 a)\n");
  30. LOG("4:Delete files by keyword, (for example: ./dirtest test_dir 4 a)\n");
  31. }
  32. /*
  33. 程序入口
  34. */
  35. int main(int argc, char *argv[])
  36. {
  37. LOG("run dir test!\n");
  38. if(argc<3) {
  39. show_help();
  40. exit(0);
  41. }
  42. dir_proc(argv);
  43. return 0;
  44. }

4.创建一个编译的Makefile,方便编译整个工程,内容如下所示:

  1. CPROG = dirtest #生成一个名为dirtest的目标文件
  2. BIN = $(CPROG)
  3. CC= gcc
  4. OBJS=main.o dirtest.o
  5. all: $(BIN)
  6. clean:
  7. rm -f $(OBJS) $(BIN)
  8. $(BIN): $(OBJS)
  9. $(CC) -o $(BIN) $(OBJS) $(CFLAGS) $(LDFLAGS) $(CFLAGS_EXTRA)

 5.创建完dirtest.c,main.c,Makefile后,便可以编译了,在该工程目录下执行make clean;make,编译成功之后会生成一个名为 “dirtest”的可执行文件。如下图所示:

 6.测试,在该路径下创建一个名为“test_dir”的目录,然后随意创建一些文件。如下图所示:

6.1列出路径下的所有文件

6.2查找文件

6.3删除文件

6.4关键字查找文件

6.5通过关键字查找,并删除文件

至此,上述功能已简单测试完毕。

总结:关于目录的操作例子就写到这里了,熟悉了这些操作,自然而然地可以自己先ls的命令了。在后续的工作中,如果有遇到针对目录以及里面相关文件的管理操作,就可以在这个例子的基础上进行快速改装了。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号