我正在尝试复制Impero的策略锁定屏幕。
我正在尝试搜索程序以查看文件是否存在。这个概念是,如果文件存在,它将被启动。
使用后台工作者搜索它会更好吗?如果是这样,我将如何搜索它?
有关如何实现所需功能的任何建议?
答案 0 :(得分:0)
由于您没有指定语言或框架,我假设您正在使用C#。你说:
我正在尝试搜索程序以查看文件是否存在。这个概念是,如果文件存在,它将被启动。
这是一个简短的片段,可以做你所问的。
string path = @"C:\path\to\file";
if (File.Exists(path))
{
Process p = new Process();
p.StartInfo.FileName = path; // launches the default application for this file
p.Start();
}
这有点过于简单:p.Start()可能由于多种原因而抛出异常。此外,您几乎无法控制哪个应用程序打开文件 - 这完全取决于用户的注册表。例如,如果用户选择要打开的HTML文件,则某些用户将看到使用Internet Explorer打开文件,而其他用户将安装Firefox,因此将使用Firefox查看该文件。
更新:
通常,我使用以下方法搜索文件:
string[] matches = Directory.GetFiles(@"C:\", "*.txt");
返回以C:\
结尾的.txt
驱动器上所有文件的所有路径。当然,您的搜索模式会有所不同。
如果调用Directory.GetFiles()(或者您正在使用的任何内容 - 您没有指定)需要很长时间,那么是的,使用BackgroundWorker是一种很好的方法。这是你如何做到的。在类的构造函数中(您可以选择将其称为SearchFiles
):
string searchPattern;
string searchDirectory;
BackgroundWorker worker;
string[] matches;
/// <summary>
/// Constructs a new SearchFiles object.
/// </summary>
public SearchFiles(string pattern, string directory)
{
searchPattern = pattern;
searchDirectory = directory;
worker = new BackgroundWorker();
worker.DoWork += FindFiles;
worker.RunWorkerCompleted += FindFilesCompleted;
worker.RunWorkerAsync();
}
void FindFilesCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
// matches should contain all the 'found' files.
// you should fire an event to notify the caller of the results
}
}
void FindFiles(object sender, DoWorkEventArgs e)
{
// this is the code that takes a long time to execute, so it's
// in the DoWork event handler.
matches = System.IO.Directory.GetFiles(searchDirectory,searchPattern);
}
我希望这能回答你的问题!