• 程序设计:C++ UNIX/Linux 目录操作(源码)


            UNIX/Linux上的目录操作。

            几个功能:

    1.         判断是否是目录
    2.         创建路径
    3.         递归清理目录
    4.         递归处理目录的框架

            代码不复杂,前三个就是函数(在同一个类中),最后一个是独立类,完整如下:

    1. #include --------------------//这里需要一些基础标准头文件
    2. #include
    3. #include
    4. #include
    5. class CDir
    6. {
    7. public:
    8. static bool IsDir(char const * strPathName)
    9. {
    10. struct stat statBuf;
    11. if (stat(strPathName, &statBuf) == -1)
    12. {
    13. cout << "stat error : " << strPathName << endl;
    14. return false;
    15. }
    16. return(statBuf.st_mode & S_IFDIR);
    17. }
    18. static bool CreateDir(char const * filename)
    19. {
    20. string dirname;
    21. char const * p = filename;
    22. for (; '\0' != *p; ++p)
    23. {
    24. dirname += *p;
    25. if ('/' == *p)
    26. {
    27. //thelog<
    28. mkdir(dirname.c_str(), S_IRWXU | S_IRWXG);
    29. }
    30. }
    31. return true;
    32. }
    33. static int ClearDir(char const * dirname, bool isKeepDir, long & count, long & count_err)
    34. {
    35. struct dirent *drip;
    36. DIR *dp;
    37. string fullname;
    38. string inputdir = dirname;
    39. if ((dp = opendir(inputdir.c_str())) == NULL)
    40. {
    41. ++count_err;
    42. thelog << "Error open dir " << inputdir << " : " << strerror(errno) << ende;
    43. return __LINE__;
    44. }
    45. while ((drip = readdir(dp)) != NULL)
    46. {
    47. if (strcmp(drip->d_name, ".") == 0 || strcmp(drip->d_name, "..") == 0)
    48. continue;
    49. fullname = inputdir + "/" + drip->d_name;
    50. //thelog<
    51. if (IsDir(fullname.c_str()))
    52. {
    53. ClearDir(fullname.c_str(), isKeepDir, count, count_err);
    54. }
    55. if (!isKeepDir || !IsDir(fullname.c_str()))
    56. {
    57. if (0 == unlink(fullname.c_str()))++count;
    58. else ++count_err;
    59. }
    60. if (count + count_err > 0 && 0 == (count + count_err) % 10000)
    61. {
    62. cout << "已处理 " << count + count_err << " 删除 " << count << " 个,出错 " << count_err << " 个" << endl;
    63. }
    64. }
    65. closedir(dp);
    66. return 0;
    67. }
    68. };
    69. class CForEachDir
    70. {
    71. private:
    72. //默认动作的数据
    73. int model;//内置的动作,0为显示名称
    74. long more_skip;//只处理这么多
    75. long doOneFile_count;//doOneFile用的计数
    76. private://接口
    77. //进入目录时调用一次
    78. virtual int doDirBegin(char const * dirname, long deep) { return 0; }
    79. virtual int doDirEnd(char const * dirname, long deep) { return 0; }
    80. //对每个文件调用一次
    81. virtual int doOneFile(char const * filename, bool isDir, long deep)
    82. {
    83. if (0 == model)
    84. {
    85. if (doOneFile_count < more_skip)cout << filename << endl;
    86. ++doOneFile_count;
    87. }
    88. else
    89. {
    90. cout << "未知的模式 " << model << endl;
    91. }
    92. return 0;
    93. }
    94. private://内部函数
    95. int _doForEachDir(char const * dirname, bool isNoDir, bool r, long & count, long & count_err, long & _, long deep)
    96. {
    97. struct dirent *drip;
    98. DIR *dp;
    99. string fullname;
    100. string inputdir = dirname;
    101. if ((dp = opendir(inputdir.c_str())) == NULL)
    102. {
    103. ++count_err;
    104. DEBUG_LOG << "Error open dir " << inputdir << " : " << strerror(errno) << ende;
    105. return __LINE__;
    106. }
    107. doDirBegin(inputdir.c_str(), deep);
    108. while ((drip = readdir(dp)) != NULL)
    109. {
    110. if (strcmp(drip->d_name, ".") == 0 || strcmp(drip->d_name, "..") == 0)
    111. continue;
    112. fullname = inputdir + "/" + drip->d_name;
    113. //thelog<
    114. bool isdir = CDir::IsDir(fullname.c_str());
    115. if (isdir && r)
    116. {
    117. _doForEachDir(fullname.c_str(), isNoDir, r, count, count_err, _, deep + 1);
    118. }
    119. if (!isNoDir || !isdir)
    120. {
    121. if (0 == doOneFile(fullname.c_str(), isdir, deep))++count;
    122. else ++count_err;
    123. }
    124. if (_ != count + count_err)
    125. {
    126. _ = count + count_err;
    127. if (count + count_err > 0 && 0 == (count + count_err) % 10000)
    128. {
    129. cout << "已处理 " << count + count_err << " 成功 " << count << " 个,出错 " << count_err << " 个" << endl;
    130. }
    131. }
    132. }
    133. doDirEnd(inputdir.c_str(), deep);
    134. closedir(dp);
    135. return 0;
    136. }
    137. public:
    138. CForEachDir():model(-1){}
    139. int doForEachDir(char const * dirname, bool isNoDir, bool r, long & count, long & count_err)
    140. {
    141. count = 0;
    142. count_err = 0;
    143. long tmp = 0;
    144. return _doForEachDir(dirname, isNoDir, r, count, count_err, tmp, 0);
    145. }
    146. int showAllFileName(char const * dirname, long _more_skip = -1)
    147. {
    148. long count;
    149. long count_err;
    150. model = 0;
    151. more_skip = _more_skip;
    152. doOneFile_count = 0;
    153. return doForEachDir(dirname, true, true, count, count_err);
    154. }
    155. };

           其中“thelog DEBUG_LOG endi”用来输出日志,替换为“cout endl”即可。

            有问题问我。

    (这里是结束)

  • 相关阅读:
    Java的JDBC编程
    会计部门通过数字化工作流程提高生产力
    机器学习-线性回归 二维问题
    读《Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection》
    IP-guard产品相关端口和服务名称
    人工智能给我们的生活带来了巨大的影响?
    Taurus .Net Core 微服务开源框架:Admin 插件【4-2】 - 配置管理-Mvc【含请求日志打印】
    Git --》如何玩转Gitee?
    java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+LW文档+部署
    「win工具」Win 上好用的效率神器Wox
  • 原文地址:https://blog.csdn.net/2301_77171572/article/details/133876951