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

yea*_*mok 2 c# comparison file

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

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

提前致谢.

pli*_*nth 9

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

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

using System;
using System.IO;
using System.Collections.Generic;

namespace DirectoryWalker
{
    public class DirectoryWalker : IEnumerable<string>
    {
        private string _seedPath;
        Func<string, bool> _directoryFilter, _fileFilter;

        public DirectoryWalker(string seedPath) : this(seedPath, null, null)
        {
        }

        public DirectoryWalker(string seedPath, Func<string, bool> directoryFilter, Func<string, bool> fileFilter)
        {
            if (seedPath == null)
                throw new ArgumentNullException(seedPath);
            _seedPath = seedPath;
            _directoryFilter = directoryFilter;
            _fileFilter = fileFilter;
        }

        public IEnumerator<string> GetEnumerator()
        {
            Queue<string> directories = new Queue<string>();
            directories.Enqueue(_seedPath);
            Queue<string> files = new Queue<string>();
            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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

典型用法是这样的:

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

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