C# 用C语言加速windows文件搜索#

C# 用C语言加速windows文件搜索#,c#,.net,windows,search,C#,.net,Windows,Search,我做了一个程序,搜索逻辑驱动器以找到一个特定的文件 点击搜索按钮,搜索开始,但我不知道如何在进程中间停止搜索。你能帮助我吗? 你需要在后台线程中运行搜索(使用后台工作人员是最方便的方法),那么你仍然可以处理输入来取消它。 处理取消请求时,可能需要在执行线程上使用Thread.Abort,或在BackgroundWorker上使用BackgroundWorker.CancelAsync() 或者,您可以让执行线程在处理循环或递归函数开始时检查变量-要取消,您只需在处理取消请求时设置此变量。您需要在

我做了一个程序,搜索逻辑驱动器以找到一个特定的文件
点击搜索按钮,搜索开始,但我不知道如何在进程中间停止搜索。你能帮助我吗?

你需要在后台线程中运行搜索(使用后台工作人员是最方便的方法),那么你仍然可以处理输入来取消它。 处理取消请求时,可能需要在执行线程上使用Thread.Abort,或在BackgroundWorker上使用BackgroundWorker.CancelAsync()


或者,您可以让执行线程在处理循环或递归函数开始时检查变量-要取消,您只需在处理取消请求时设置此变量。

您需要在后台线程中运行搜索(使用BackgroundWorker是最方便的方法)然后您仍然可以处理输入以取消它

处理取消请求时,可能需要在执行线程上使用Thread.Abort,或在BackgroundWorker上使用BackgroundWorker.CancelAsync()


或者,您可以让执行线程在处理循环或递归函数开始时检查变量-要取消,您只需在处理取消请求时设置此变量。

您应该在后台线程上执行搜索,以便它不会阻塞UI。很好地介绍和演练了您需要对应用程序所做的更改。

您应该在后台线程上执行搜索,以便它不会阻塞UI。很好地介绍和演练了您需要对应用程序进行的更改。

您需要在.net中使用Backgroundworker类。它在单独的线程上执行,并具有用于取消、报告进度和更多的内置方法/属性

请阅读以下文章以开始使用:


您需要在.net中使用Backgroundworker类。它在单独的线程上执行,并具有用于取消、报告进度和更多的内置方法/属性

请阅读以下文章以开始使用:


正如其他人提到的,您的解决方案可能是使用
BackgroundWorker
CancelAsync
方法

以下是一些工作代码,您只需稍作修改即可使用:

class Program
{
    static void Main(string[] args)
    {
        var search = new FileSearcher().FindFile(@"d:\users", "autofac.dll", f => Console.WriteLine(f.FullName), () => Console.WriteLine("Finished"));

        Console.WriteLine("C - cancel, else - finish");

        for (; ; )
        {
            var command = Console.ReadLine();
            switch (command)
            {
                case "C":
                    search.Cancel();
                    break;

                default:
                    return;
            }
        }
    }
}

public class FileSearcher
{
    public FileSearch FindFile(string searchPath, string fileName, Action<FileInfo> onFileFound, Action onSearchFinished)
    {
        var search = new FileSearch(new DirectoryInfo(searchPath), fileName);
        search.FileFound += onFileFound;
        search.Finished += onSearchFinished;
        search.Run();
        return search;
    }
}

public class FileSearch
{
    readonly BackgroundWorker _worker = new BackgroundWorker();
    readonly DirectoryInfo _searchPath;
    readonly string _template;

    public FileSearch(DirectoryInfo searchPath, string template)
    {
        _searchPath = searchPath;
        _template = template;

        _worker.DoWork += _worker_DoWork;
        _worker.RunWorkerCompleted += _worker_RunWorkerCompleted;
        _worker.WorkerSupportsCancellation = true;
    }

    void _worker_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (var directory in GetPartiallyFlatDirectories(_searchPath, 4))
        {
            if (_worker.CancellationPending)
                break;

            foreach (var file in directory.GetFiles(_template, SearchOption.AllDirectories))
                FileFound.Raise(file);
        }
    }

    static IEnumerable<DirectoryInfo> GetPartiallyFlatDirectories(DirectoryInfo directory, int flatDepth)
    {
        if (flatDepth == 0)
        {
            yield return directory;
            yield break;
        }

        foreach (var subDir in directory.GetDirectories())
        {
            var flattened = GetPartiallyFlatDirectories(subDir, flatDepth - 1);

            if (!flattened.Any())
                yield return subDir;
            else
                foreach (var flatDirectory in flattened)
                    yield return flatDirectory;
        }
    }

    void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Finished.Raise();
    }

    public void Cancel()
    {
        _worker.CancelAsync();
    }

    public event Action<FileInfo> FileFound;
    public event Action Finished;

    public void Run()
    {
        _worker.RunWorkerAsync();
    }
}

public static class DelegateExtensions
{
    public static void Raise<T>(this Action<T> action, T obj)
    {
        if (action != null)
            action(obj);
    }

    public static void Raise(this Action action)
    {
        if (action != null)
            action();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var search=new filesearch().FindFile(@“d:\users”,“autofac.dll”,f=>Console.WriteLine(f.FullName),()=>Console.WriteLine(“Finished”);
Console.WriteLine(“C-取消,else-完成”);
对于(;;)
{
var命令=Console.ReadLine();
开关(命令)
{
案例“C”:
search.Cancel();
打破
违约:
返回;
}
}
}
}
公共类文件搜索器
{
公共文件搜索FindFile(字符串搜索路径、字符串文件名、操作onFileFound、操作onSearchFinished)
{
var search=newfilesearch(新目录信息(searchPath),文件名);
search.FileFound+=onFileFound;
search.Finished+=onSearchFinished;
search.Run();
返回搜索;
}
}
公共类文件搜索
{
readonly BackgroundWorker _worker=新BackgroundWorker();
只读目录信息搜索路径;
只读字符串_模板;
公共文件搜索(目录信息搜索路径,字符串模板)
{
_searchPath=searchPath;
_模板=模板;
_worker.DoWork+=\u worker\u DoWork;
_worker.RunWorkerCompleted+=\u worker\u RunWorkerCompleted;
_worker.worker支持扫描单元=true;
}
void\u worker\u DoWork(对象发送方,DoWorkEventArgs e)
{
foreach(getPartiallyFlatDirectory(_searchPath,4))中的var目录
{
如果(_worker.CancellationPending)
打破
foreach(directory.GetFiles(_template,SearchOption.AllDirectories)中的var文件)
FileFound.Raise(文件);
}
}
静态IEnumerable GetPartiallyFlatDirectory(DirectoryInfo目录,int-flatDepth)
{
如果(flatDepth==0)
{
生成返回目录;
屈服断裂;
}
foreach(目录.GetDirectories()中的var subDir)
{
var flatted=getPartiallyFlatDirectory(subDir,flatDepth-1);
如果(!flatted.Any())
收益率;
其他的
foreach(展开中的目录)
生成返回目录;
}
}
void\u worker\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
完成。升起();
}
公开作废取消()
{
_worker.CancelAsync();
}
发现公共事件行动文件;
公共事件行动完成;
公开募捐
{
_worker.RunWorkerAsync();
}
}
公共静态类DelegateExtensions
{
公共静态无效提升(此操作,T obj)
{
如果(操作!=null)
行动(obj);
}
公共静态无效提升(此操作)
{
如果(操作!=null)
动作();
}
}

正如其他人提到的,您的解决方案可能是使用
BackgroundWorker
CancelAsync
方法

以下是一些工作代码,您只需稍作修改即可使用:

class Program
{
    static void Main(string[] args)
    {
        var search = new FileSearcher().FindFile(@"d:\users", "autofac.dll", f => Console.WriteLine(f.FullName), () => Console.WriteLine("Finished"));

        Console.WriteLine("C - cancel, else - finish");

        for (; ; )
        {
            var command = Console.ReadLine();
            switch (command)
            {
                case "C":
                    search.Cancel();
                    break;

                default:
                    return;
            }
        }
    }
}

public class FileSearcher
{
    public FileSearch FindFile(string searchPath, string fileName, Action<FileInfo> onFileFound, Action onSearchFinished)
    {
        var search = new FileSearch(new DirectoryInfo(searchPath), fileName);
        search.FileFound += onFileFound;
        search.Finished += onSearchFinished;
        search.Run();
        return search;
    }
}

public class FileSearch
{
    readonly BackgroundWorker _worker = new BackgroundWorker();
    readonly DirectoryInfo _searchPath;
    readonly string _template;

    public FileSearch(DirectoryInfo searchPath, string template)
    {
        _searchPath = searchPath;
        _template = template;

        _worker.DoWork += _worker_DoWork;
        _worker.RunWorkerCompleted += _worker_RunWorkerCompleted;
        _worker.WorkerSupportsCancellation = true;
    }

    void _worker_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (var directory in GetPartiallyFlatDirectories(_searchPath, 4))
        {
            if (_worker.CancellationPending)
                break;

            foreach (var file in directory.GetFiles(_template, SearchOption.AllDirectories))
                FileFound.Raise(file);
        }
    }

    static IEnumerable<DirectoryInfo> GetPartiallyFlatDirectories(DirectoryInfo directory, int flatDepth)
    {
        if (flatDepth == 0)
        {
            yield return directory;
            yield break;
        }

        foreach (var subDir in directory.GetDirectories())
        {
            var flattened = GetPartiallyFlatDirectories(subDir, flatDepth - 1);

            if (!flattened.Any())
                yield return subDir;
            else
                foreach (var flatDirectory in flattened)
                    yield return flatDirectory;
        }
    }

    void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Finished.Raise();
    }

    public void Cancel()
    {
        _worker.CancelAsync();
    }

    public event Action<FileInfo> FileFound;
    public event Action Finished;

    public void Run()
    {
        _worker.RunWorkerAsync();
    }
}

public static class DelegateExtensions
{
    public static void Raise<T>(this Action<T> action, T obj)
    {
        if (action != null)
            action(obj);
    }

    public static void Raise(this Action action)
    {
        if (action != null)
            action();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var search=new filesearch().FindFile(@“d:\users”,“autofac.dll”,f=>Console.WriteLine(f.FullName),()=>Console.WriteLine(“Finished”);
Console.WriteLine(“C-取消,else-完成”);
对于(;;)
{
var命令=Console.ReadLine();
开关(命令)
{
案例“C”: