{"id":2972,"date":"2026-08-15T08:11:43","date_gmt":"2026-08-15T11:11:43","guid":{"rendered":"http:\/\/www.hoogervorst.ca\/arthur\/?page_id=2972"},"modified":"2026-08-15T08:53:53","modified_gmt":"2026-08-15T11:53:53","slug":"fandro2-cli","status":"publish","type":"page","link":"http:\/\/www.hoogervorst.ca\/arthur\/?page_id=2972","title":{"rendered":"Fandro2.cli"},"content":{"rendered":"\n<p>The official platform agnostic fandro2 libraries  &#8211; now working in Linux\/Windows\/MacOSX. No screenshot this time.<\/p>\n\n\n\n<p>github: <a href=\"https:\/\/github.com\/hooverdirt\/fandro2.cli\">https:\/\/github.com\/hooverdirt\/fandro2.cli<\/a><\/p>\n\n\n\n<p>The major change is the threading model &#8211; fandro2 has a Windows specific (now legacy) threading model and to make it portable, I had to change it and use Progress&lt;T&gt; and async patterns.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using FandroSearch.Finders.Matching;\nusing FandroSearch.Finders.Threading;\n\nFoldersWordFinder finder = new FoldersWordFinder {\n    StartFolder = \"\/path\/to\/search\",\n    Mask = \"*.txt\",\n    Recursive = true,\n    Pattern = \"TODO\",\n    Conditions = new FileFilters { \/* optional filters *\/ }\n};\n\nList&lt;SearchReport&gt; results = new List&lt;SearchReport&gt;();\nProgress&lt;SearchReport&gt; progress = new Progress&lt;SearchReport&gt;(results.Add);\n\n\/\/ do the actual work\nawait finder.DoWorkAsync(progress, CancellationToken.None);<\/pre>\n\n\n\n<p>See also Microsoft&#8217;s Async programming page(s) &#8211; <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/asynchronous-programming\/async-scenarios\">(C# SDK\/pages)<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The official platform agnostic fandro2 libraries &#8211; now working in Linux\/Windows\/MacOSX. No screenshot this time. github: https:\/\/github.com\/hooverdirt\/fandro2.cli The major change is the threading model &#8211; fandro2 has a Windows specific (now legacy) threading model and to make it portable, I &hellip; <a href=\"http:\/\/www.hoogervorst.ca\/arthur\/?page_id=2972\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":942,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/pages\/2972"}],"collection":[{"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2972"}],"version-history":[{"count":4,"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/pages\/2972\/revisions"}],"predecessor-version":[{"id":2977,"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/pages\/2972\/revisions\/2977"}],"up":[{"embeddable":true,"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=\/wp\/v2\/pages\/942"}],"wp:attachment":[{"href":"http:\/\/www.hoogervorst.ca\/arthur\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}