yea*_*mok 2 c# comparison file
我正在尝试创建一个扫描驱动器的应用程序.但棘手的是,我的驱动器包含一组文件夹,这些文件夹在文件夹中包含文件夹并包含文档.我正在尝试扫描驱动器,获取所有文档和文件夹的"快照"并转储到.txt文件中.
我第一次运行这个应用程序时,输出将是一个包含所有文件夹和文件的文本文件.
我第二次运行这个应用程序,它将需要2个文本文件(从我第二次运行应用程序和第一次运行应用程序时的.txt文件生成的文件)并比较它们...报告什么已被移动/覆盖/删除.
有没有人有这个代码?我是这个C#的新手,任何帮助都会非常感激.
提前致谢.
我们在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"结尾的所有文件