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”: