Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23345
  • 博文数量: 3
  • 博客积分: 86
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-11 22:58
文章分类

全部博文(3)

文章存档

2012年(3)

我的朋友

分类: C/C++

2012-05-19 15:06:07

看了一些《SCIP》,最深的体会就是:编程就是不断的提取出共性的东西,做成一个抽象的函数来操作。
例如里面有一个概念叫做高阶函数(higher-order procedures),
其实就是把函数当成数据来操作。

这些在C/C++里面也经常用到,比如Sort一个list时,会传递进去一个比较大小的函数
例如Sort(list[], n, void (*cmp)(void*, void*))

最近写一个模块,里面有小一部分需要对目录进行操作:
1. 打印某个目录下所有的文件
2. 遍历的删除一个目录(这个是因为Win32的RemoveDirectory()和linux的rmdir()都只能删除空文件)

这两个操作的共性是都需要遍历目录下的文件,所以可以提取成一个函数,
然后在定义各自的操作函数去实现各自的功能就可以了

点击(此处)折叠或打开

  1. typedef void (*FileOperator)(const char* dir_name, void* file_data);

  2. void TraverseDir(const char* dir_name, FileOperator fop)
  3. {
  4. #ifdef _WIN32
  5.     char search_path[MAX_FILE_PATH_LEN];
  6.     snprintf(search_path, MAX_FILE_PATH_LEN, "%s/*", dir_name);

  7.     DWORD err_code = 0;
  8.     WIN32_FIND_DATA find_data;
  9.     HANDLE hOpen = FindFirstFile(search_path, &find_data);
  10.     if (hOpen == INVALID_HANDLE_VALUE)
  11.     {
  12.         err_code = GetLastError();
  13.         printf("FindFirstFile failed, path: %s, error code: %d\n",
  14.                dir_name, err_code);
  15.     }

  16.     while (FindNextFile(hOpen, &find_data))
  17.     {
  18.         if (  (strcmp(find_data.cFileName, ".") == 0) ||
  19.               (strcmp(find_data.cFileName, "..") == 0) )
  20.             continue;

  21.         fop(dir_name, &find_data);
  22.     }

  23.     FindClose(hOpen);
  24. #else
  25.     struct dirent* pDirEntry = NULL;
  26.     DIR* pDir = opendir(dir_name);
  27.     if (pDir == NULL)
  28.     {
  29.         printf("opendir failed, path: %s, error code: %d\n",
  30.                dir_name, errno);
  31.     }

  32.     while (pDirEntry = readdir(pDir))
  33.     {
  34.         if ( (strcmp(pDirEntry->d_name, ".") == 0) ||
  35.              (strcmp(pDirEntry->d_name, "..") == 0) )
  36.             continue;

  37.         fop(dir_name, pDirEntry, out_data);
  38.     }
  39.     closedir(pDir);
  40. #endif
  41. }


 


然后提取了WIN32和linux平台的共同操作:

点击(此处)折叠或打开

  1. int MyDeleteFile(const char* filename)
  2. {
  3.     int result = -1;
  4. #ifdef _WIN32
  5.     DeleteFile(filename))
  6.         result = 0;
  7. #else
  8.     if (unlink(filename) == 0)
  9.         result = 0;
  10. #endif
  11.     
  12.     return result;
  13. }

  14. int MyDeleteDir(const char* dir_name)
  15. {
  16.     int result = -1;
  17. #ifdef _WIN32
  18.     if (RemoveDirectory(dir_name))
  19.         result = 0;
  20. #else
  21.     if (rmdir(dir_name) == 0)
  22.         result = 0;
  23. #endif

  24.     return result;
  25. }

  26. bool IsDir(void* data)
  27. {
  28.     bool ret = false;
  29. #ifdef _WIN32
  30.     WIN32_FIND_DATA* pFindData = (WIN32_FIND_DATA*)data;
  31.     if (pFindData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  32.         ret = true;
  33. #else
  34.     struct dirent* pDirEntry = (struct dirent*)data;
  35.     if (pDirEntry->d_type & DT_DIR)
  36.         ret = true;
  37. #endif

  38.     return ret;
  39. }

  40. char* GetFileName(void* data)
  41. {
  42.     char* filename = NULL;
  43. #ifdef _WIN32
  44.     WIN32_FIND_DATA* pFindData = (WIN32_FIND_DATA*)data;
  45.     filename = pFindData->cFileName;
  46. #else
  47.     struct dirent* pDirEntry = (struct dirent*)data;
  48.     filename = pDirEntry->d_name;
  49. #endif
  50.     return filename;
  51. }
最后定义打印和删除操作:

点击(此处)折叠或打开

  1. void PrintOperator(char* dir_name, void* file_data)
  2. {
  3.     printf("%s/%s, %s", dir_name, GetFileName(file_data), 
  4.         IsDir(file_data) ? "dir" : "file")
  5. }

  6. uint32_t RmdirOperator(char* dir_name, void* file_data)
  7. {
  8.      char child_dir_name[MAX_FILE_PATH_LEN];
  9.      snprintf(child_dir_name, MAX_FILE_PATH_LEN, "%s/%s",
  10.               ir_name, GetFileName(in_data));

  11.      if (IsDir(file_data))
  12.      {
  13.          TraverseDir(child_dir_name, FileOperatorRmdir);

  14.          MyDeleteDir(child_dir_name);
  15.      }
  16.      else
  17.      {
  18.          MyDeleteFile(child_dir_name);
  19.      }
  20. }

  21. void PrintDir(char* dir)
  22. {
  23.     TraverseDir(dir, PrintOperator);
  24. }

  25. void Rmdir(char* dir)
  26. {
  27.     TraverseDir(dir, RmdirOperator);
  28.     MyDeleteDir(dir)
  29. }











阅读(2682) | 评论(0) | 转发(0) |
0

上一篇:阅读发散症

下一篇:没有了

给主人留下些什么吧!~~