You have 2 issues to deal with here.
The first is if you want to watch for dynamic changes (made while your program is running). In that case, you need to use the Windows API ReadDirectoryChangesW. There are plenty of on-line examples for how to use it. (Beware... some examples are not very good. This API call CAN AND WILL return more than one event for each call and you need to read the interface carefully, understand how it works, and process EVERYTHING that gets returned.
The second issue is if you have a folder, or list of folders, and you want to check if its / their contents have changed - either by adding/deleting or changing files in that folder.
In this case, the most effective method is to read the folder contents a file name at a time, and make a cumulative hash. More than that, though, you also want to get the attributes (using something like GetFileAttributesEx), and include those in the hash as well. (make sure to exclude the folders "." and ".." - or the results will be misleading.)
The reason for this is that you want to catch changes in a file by its size, dates, etc. You probably dont want to include the LastAccessed time though.
Any big hashing function should do. The result is a single big number (the hash) for each folder.
Then when you make another pass over, you re-compute the hash and compare with the stored hash for the last known state of that folder. If the hashes don't match, then you need to go poking through the folder in detail.
Effectively, this approach tells you (quickly) that there is something here you need to look at in more detail, and how you do that depends on what you are trying to achieve.
This has the advantage that you are not looking at the contents of each file in the folder, but instead at some meta-data which gives you enough of an indication. The processing is thus many thousands of times faster.