
C++17 Filesystem – Writing a simple file watcher - mmisu
https://solarianprogrammer.com/2019/01/13/cpp-17-filesystem-write-file-watcher-monitor/?qwert
======
zeroname
Guys, don't do this. There are OS-specific APIs to do this stuff efficiently.
No, that's not portable. No, those APIs aren't "nice to use". But it's the
"right" way to do it.

When you do that kind of stuff, keep in mind that many programs modify files
by writing to a temp file and then renaming that file.

On a secondary note, "modern C++" needs to be stopped. This is absurd:

std::chrono::duration<int, std::milli>

Just say no. Don't include stuff like <chrono> or <functional>. Ignore
Bjarne's opinions. Don't read books by Scott Meyers. Being effective with C++
means understanding its "powers" and then _not_ using them.

~~~
asveikau
I agree and came here to comment that you should _not_ use this code.

The code has sleep calls and polls the filesystem. The nonportable OS support
will actually block and have the kernel wake you up when there are actual
changes - and not wake you when there is no change - much kinder on the CPU!

Just say no indeed, to polling the filesystem with sleep calls. (Maybe as a
last resort if the OS specific support is unavailable?)

------
Topgamer7
Those files have so many "std::" references. Would this not be a good case to
utilize "using namespace std"?

~~~
favorited
It's a header-only class[0], and "using namespace" in headers is discouraged.

[0] [https://github.com/sol-
prog/cpp17-filewatcher/blob/master/Fi...](https://github.com/sol-
prog/cpp17-filewatcher/blob/master/FileWatcher.h)

~~~
Someone
But one could use it scoped to the _FileWatcher_ class or to each member
function, or is my C++ too rusty?

~~~
jhalstead
I think it's too rusty, unless I'm misunderstanding
[https://abseil.io/tips/153](https://abseil.io/tips/153). It says,

 _The vast majority of C++ users think that the using-directive is injecting
names into the scope where it’s declared. ... In reality, the names are
injected into the nearest common ancestor of the target namespace (::testing)
and the usage namespace (::totw::example::anomymous). In our example, that’s
the global namespace!_

------
wmu
std::unordered_map has method count(), C++20 will be probably just a wrapper
for the method.

[https://en.cppreference.com/w/cpp/container/unordered_map/co...](https://en.cppreference.com/w/cpp/container/unordered_map/count)

~~~
mmisu
Are you confusing _.count_ with _.contains_ ?

~~~
wmu
I'm saying that map.contains(x) == bool(map.count(x))

~~~
mmisu
+1 I see what you mean now.

~~~
wmu
Great! :) My initial comment wasn't clear, sorry for that.

------
ohiovr
watch ls

