使用C#通过下钻来扫描硬盘?

我正在尝试创建一个扫描驱动器的应用程序。 但棘手的是,我的驱动器包含一组文件夹,这些文件夹在文件夹中包含文件夹并包含文档。 我正在尝试扫描驱动器,获取所有文档和文件夹的“快照”并转储到.txt文件中。
我第一次运行这个应用程序时,输出将是一个包含所有文件夹和文件的文本文件。
我第二次运行这个应用程序,它将需要2个文本文件(从第二次运行应用程序生成的文件和第一次运行应用程序时的.txt文件)并比较它们…报告内容已被移动/覆盖/删除。

有没有人有这方面的代码? 我是这个C#的新手,任何帮助都会非常感激。

提前致谢。

我们在80年代学到的一件事是,如果使用递归进行文件系统行走真的很诱人,但是当你这样做时,有人会创建一个嵌套级别的文件系统,这会导致堆栈溢出。 使用基于堆的文件系统行走要好得多。

这是一个我一起敲门的课程。 它并不是非常漂亮,但它能很好地完成这项工作:

using System; using System.IO; using System.Collections.Generic; namespace DirectoryWalker { public class DirectoryWalker : IEnumerable { private string _seedPath; Func _directoryFilter, _fileFilter; public DirectoryWalker(string seedPath) : this(seedPath, null, null) { } public DirectoryWalker(string seedPath, Func directoryFilter, Func fileFilter) { if (seedPath == null) throw new ArgumentNullException(seedPath); _seedPath = seedPath; _directoryFilter = directoryFilter; _fileFilter = fileFilter; } public IEnumerator GetEnumerator() { Queue directories = new Queue(); directories.Enqueue(_seedPath); Queue files = new Queue(); while (files.Count > 0 || directories.Count > 0) { if (files.Count > 0) { yield return files.Dequeue(); } if (directories.Count > 0) { string dir = directories.Dequeue(); string[] newDirectories = Directory.GetDirectories(dir); string[] newFiles = Directory.GetFiles(dir); foreach (string path in newDirectories) { if (_directoryFilter == null || _directoryFilter(path)) directories.Enqueue(path); } foreach (string path in newFiles) { if (_fileFilter == null || _fileFilter(path)) files.Enqueue(path); } } } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } } 

典型用法是这样的:

 DirectoryWalker walker = new DirectoryWalker(@"C:\pathToSource\src", null, (x => x.EndsWith(".cs"))); foreach (string s in walker) { Console.WriteLine(s); } 

以递归方式列出以“.cs”结尾的所有文件

比文本文件比较更好的方法是使用FileSystemWatcher类 。

当目录或目录中的文件发生更改时,侦听文件系统更改通知并引发事件。

您可以记录更改,然后根据需要从该日志生成报告。

您可以轻松地使用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代码才能构建该function,即使这样,它也不会100%正确,因为它不会将文件系统分页为发生了变化 – 由于时间,逻辑结构,处理时间,应用程序运行时或者仅仅是由于计算机的纯粹反应,总会存在由于时间,逻辑结构,处理时间而无法在逻辑中正确报告的情况的可能性。

此外,处理时间会随着驱动器的大小呈指数级增长。 毕竟,您需要针对每个其他文件检查每个文件以确定其状态而不是之前的状态。 我不想在家里对着我的600 + GB驱动器运行它,更不用说我在服务器上运行的40TB驱动器了。