{"id":4386,"date":"2019-06-09T07:57:46","date_gmt":"2019-06-09T06:57:46","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=4386"},"modified":"2019-06-10T17:29:02","modified_gmt":"2019-06-10T16:29:02","slug":"c-guns-stdfilesystem-und-stdregex","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=4386","title":{"rendered":"C++ Guns: std::filesystem und std::regex"},"content":{"rendered":"<p>Heute mache ich die ersten Versuche mit std::filesystem und std::regex. Der GCC 8.1 ist installiert. Die Doku liegt bereit. Es kann los gehen.<\/p>\n<h2>std::filesystem<\/h2>\n<p>Ich m\u00f6chte bestimmte \"M\u00fcll\" Dateien im Projekt Verzeichnis auflisten und ihren Speicherplatzverbrauch summieren. Die Handhabung von std::filesystem ist wirklich erstaunlich einfach. Klar strukturiert. Es funktioniert. Etwas, dass b\u00f6se Zungen von std::chrono ja nicht behaupten.<\/p>\n<p>Eine Schleife \u00fcber alle Dateien in einem Verzeichnis geht echt fix:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;filesystem&gt;\r\n#include &lt;iostream&gt;\r\nnamespace fs = std::filesystem;\r\nfor(auto&amp; p: fs::recursive_directory_iterator(&quot;\/&quot;, fs::directory_options::skip_permission_denied)) {\r\n    if(p.is_regular_file()) {\r\n        std::cout &lt;&lt; p.path().filename() &lt;&lt; &quot; &quot; &lt;&lt; p.file_size() &lt;&lt; '\\n';\r\n    }\r\n}\r\n<\/pre>\n<p>Bis GCC 8 muss das Projekt noch explizit mit -lstdc++fs, ab GCC 9 dann nicht mehr.<\/p>\n<p>Achtung: Beim GCC 8.1 und Netzlaufwerke hab ich festgestellt, dass <em>is_regular_file()<\/em> falsche Werte zur\u00fcck gibt. Im Vergleich zu <em>fs::is_regular_file(fs::status(p))<\/em>, was das selbe macht. Ob das im GCC 9.1 auch so ist, muss ich noch pr\u00fcfen.<\/p>\n<p>Die Fehlerbehandlung ist auch nett gel\u00f6st. Man hat diesmal die Auswahl zwischen Exception und Error Code. Viele Funktionen kann ein error_eode Objekt \u00fcbergeben werden (als Referenz nicht als Pointer woohoo!).<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstd::error_code ec;\r\nfor(auto&amp; p: fs::recursive_directory_iterator(&quot;\/&quot;, fs::directory_options::skip_permission_denied, ec)) {\r\nif(e) {\r\n    std::cout &lt;&lt; e.message();\r\n<\/pre>\n<p>Oder mit Exception.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntry {            \r\n    if(fs::is_regular_file(fs::status(p))) {\r\n    }\r\ncatch(fs::filesystem_error&amp; err) {\r\n    std::cerr &lt;&lt; err.what() &lt;&lt; &quot;\\n&quot;;\r\n}\r\n<\/pre>\n<p>Als keiner Bonus hier meine std::filesystem::file_type ostream Funktion<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstd::ostream&amp; operator&lt;&lt;(std::ostream&amp; s, const std::filesystem::file_type type) {\r\n    using std::filesystem::file_type;\r\n    switch (type) {\r\n    case file_type::none:      s &lt;&lt; &quot;none&quot;; break;\r\n    case file_type::not_found: s &lt;&lt; &quot;not_found&quot;; break;\r\n    case file_type::regular:   s &lt;&lt; &quot;regular&quot;; break;\r\n    case file_type::directory: s &lt;&lt; &quot;directory&quot;; break;\r\n    case file_type::symlink:   s &lt;&lt; &quot;symlink&quot;; break;\r\n    case file_type::block:     s &lt;&lt; &quot;block&quot;; break;\r\n    case file_type::character: s &lt;&lt; &quot;character&quot;; break;\r\n    case file_type::fifo:      s &lt;&lt; &quot;fifo&quot;; break;\r\n    case file_type::socket:    s &lt;&lt; &quot;socket&quot;; break;\r\n    case file_type::unknown:   s &lt;&lt; &quot;unknown&quot;; break;\r\n    }\r\n    return s;\r\n}\r\n<\/pre>\n<h2>std::regex<\/h2>\n<p>Regex ist auch garnicht sooo schwer, wenn man es mal kann. Ich m\u00f6chte alle Dateien dieser Form finden: dbg_0000 dbg_0001 u.s.w. Das passende Regex Objekt sieht dann so aus:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nconst std::regex dbg_regex(&quot;dbg_&#x5B;&#x5B;:digit:]]+&quot;);\r\n\r\nfor(auto&amp; p: fs::recursive_directory_iterator(&quot;\/&quot;, fs::directory_options::skip_permission_denied)) {\r\n    if(p.is_regular_file()) {\r\n       if(std::regex_match(p.path().filename().c_str(), dbg_regex)) {\r\n           \/\/ found\r\n       }\r\n    }\r\n}\r\n<\/pre>\n<p>Als Verbindung zwischen Dateiname und Regex dient C-String. Da es string_view hier (noch?) nicht gibt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Heute mache ich die ersten Versuche mit std::filesystem und std::regex. Der GCC 8.1 ist installiert. Die Doku liegt bereit. Es kann los gehen. std::filesystem Ich m\u00f6chte bestimmte \"M\u00fcll\" Dateien im Projekt Verzeichnis auflisten und ihren Speicherplatzverbrauch summieren. Die Handhabung von std::filesystem ist wirklich erstaunlich einfach. Klar strukturiert. Es funktioniert. Etwas, dass b\u00f6se Zungen von std::chrono [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-4386","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4386"}],"version-history":[{"count":10,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4386\/revisions"}],"predecessor-version":[{"id":4402,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4386\/revisions\/4402"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4386"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}