Вы можете легко использовать для этого классы DirectoryInfo / FileInfo.
По существу, экземпляр экземпляра класса DirectoryInfo указывает на папку c: \. Затем с помощью его объектов пройдитесь по структуре папок.
http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx имеет код, который можно легко перевести.
Теперь другая часть вашего вопроса - безумие. Вы можете найти различия между этими двумя файлами относительно легко, но преобразование этого в то, что было перемещено / удалено / и т. Д., Потребует некоторых довольно продвинутых логических структур. В конце концов, если у меня есть два файла, оба с именем myfile.dat, и один из них находится в c: \ foo, а другой - в c: \ notfoo, как будет поступать сообщение о том, что один в c: \ notfoo, если я удалил один в C: \ Foo? Другой пример, если у меня есть файл myfile2.dat и я скопирую его из c: \ bar в c: \ notbar, это считается ходом? Что произойдет, если я скопирую его во вторник, а затем в четверг удаляю c: \ bar \ myfile2.dat - это перемещение или удаление? И изменится ли ответ, если я запускаю программу каждый понедельник, а не ежедневно?
Существует целый ряд вопросов и соответствующих им логических структур, для которых вам нужно подумать о коде amd для создания этой функциональности, и даже в этом случае он не будет на 100% правильным, поскольку он не разбивает на страницы. Файловая система по мере изменений - всегда будет существовать вероятность того, что сценарий не будет правильно представлен в вашей логике из-за синхронизации, логической структуры, времени процесса, когда приложение запускается или просто из-за извращенности компьютеров.
Кроме того, время обработки будет расти в геометрической прогрессии в зависимости от размера вашего диска. В конце концов, вам нужно сравнить каждый файл с каждым другим файлом, чтобы определить его состояние, а не предыдущее. Я бы не хотел запускать это в домашних условиях на моем накопителе объемом 600 ГБ, не говоря уже о накопителях емкостью 40 ТБ, которые установлены на серверах в работе.