CodeCompass

Форк
0
/
parserutil.cpp 
112 строк · 2.1 Кб
1
#include <chrono>
2

3
#include <boost/filesystem.hpp>
4

5
#include <util/logutil.h>
6
#include <util/parserutil.h>
7

8
namespace fs = boost::filesystem;
9

10
namespace
11
{
12

13
/**
14
* Context to iterateDirectoryRecursive.
15
*/
16
struct TraverseContext
17
{
18
 /**
19
  * Time of last status report.
20
  */
21
 std::chrono::time_point<std::chrono::system_clock> lastReportTime =
22
   std::chrono::system_clock::now();
23
 /**
24
  * Total number of (regular) files visited in the iteration.
25
  */
26
 std::size_t numFilesVisited = 0;
27
 /**
28
  * Total number of directories visited in the iteration.
29
  */
30
 std::size_t numDirsVisited = 0;
31
};
32

33
bool iterateDirectoryRecursive(
34
  TraverseContext& context_,
35
  const std::string& path_,
36
  cc::util::DirIterCallback callback_)
37
{
38
  //--- Status reporting ---//
39

40
  auto currTime = std::chrono::system_clock::now();
41
  if ((currTime - context_.lastReportTime) >= std::chrono::seconds(15))
42
  {
43
    // It's time to report
44
    LOG(info)
45
      << "Recursive directory iteration: visited "
46
      << context_.numFilesVisited << " files in "
47
      << context_.numDirsVisited << " directories so far.";
48
    context_.lastReportTime = currTime;
49
  }
50

51
  fs::path p(path_);
52

53
  boost::system::error_code ec;
54
  auto target = fs::canonical(p, ec);
55
  if (ec)
56
  {
57
    LOG(warning) << p << ": " << ec.message();
58
    return true;
59
  }
60

61
  if (!fs::exists(p))
62
  {
63
    LOG(warning) << "Not found: " << p;
64
    return true;
65
  }
66

67
  if (fs::is_directory(p))
68
  {
69
    ++context_.numDirsVisited;
70
  }
71
  else if(fs::is_regular_file(p))
72
  {
73
    ++context_.numFilesVisited;
74
  }
75

76
  //--- Call callback ---//
77

78
  if (!callback_(path_))
79
    return false;
80

81
  //--- Iterate over directory content ---//
82

83
  if (fs::is_directory(p))
84
    for (fs::directory_iterator it(p), end_iter; it != end_iter; ++it)
85
    {
86
      std::string path = it->path().c_str();
87

88
      if (!iterateDirectoryRecursive(context_, path , callback_))
89
        continue;
90
    }
91

92
  return true;
93
}
94

95
} // anonymus namespace
96

97
namespace cc
98
{
99
namespace util
100
{
101

102
bool iterateDirectoryRecursive(
103
  const std::string& path_,
104
  DirIterCallback callback_)
105
{
106
  TraverseContext ctx;
107
  std::string path = path_;
108
  return ::iterateDirectoryRecursive(ctx, path, callback_);
109
}
110

111
}
112
}
113

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.