/*
.net/c# 封装磁盘目录文件搜索功能的工具类
(实现了与搜索相关的事件,以便插入客户处理代码)
*/
// searchwithevents.cs :
// 输出 exe:
// csc.exe searchwithevents.cs /r:c:\windows\microsoft.net\framework\v1.1.4322\microsoft.visualbasic.dll
// 输出 dll:
// csc.exe /t:library searchwithevents.cs /r:c:\windows\microsoft.net\framework\v1.1.4322\microsoft.visualbasic.dll
//using system;
namespace microshaoft.utils
{
/// <summary>
/// .net/c# 实现磁盘目录文件搜索的工具类 (搜索事件)
/// </summary>
public class search
{
/// <summary>
/// 递归
/// </summary>
/// <param name="sourcedirectory">被搜索的源目录</param>
/// <param name="directorypatterns">源目录下面的所有子目录的搜索匹配模式</param>
/// <param name="filepatterns">源目录下面的所有文件的搜索匹配模式</param>
/// <param name="destinationdirectory">存储相对路径</param>
private void searching(string sourcedirectory, string directorypatterns, string filepatterns, string destinationdirectory)
{
this._directorypatterns = directorypatterns;
this._filepatterns = filepatterns;
string[] patterns = this._directorypatterns.split(';');
string[] patterns = this._filepatterns.split(';');
this._directoryid = 0;
this._fileid = 0;
destinationdirectory += (destinationdirectory.endswith(@"\") ? "" : @"\");
if (this._directoriescount == 0) //处理源目录的当前的文件
{
this._directoriescount ++;
this._directoryid ++;
this._currentdirectoryname = sourcedirectory;
if (sourcedirectory.endswith(@"\"))
{
this._currentdirectoryname = sourcedirectory.substring(0, sourcedirectory.length - 1);
}
this._parentdirectoryname = this._currentdirectoryname.substring(this._currentdirectoryname.lastindexof(@"\") + 1);
destinationdirectory += this._parentdirectoryname + @"\";
this._currentdestinationdirectoryname = destinationdirectory;
if (this.addsearcheddirectory(this._currentdirectoryname))
{
this._directoryuid ++;
}
if (searcheddirectory != null) //触发一次找到源目录的事件
{
onsearcheddirectory(sourcedirectory, this._directoriescount, this._directoryid, this._currentdestinationdirectoryname);
}
foreach (string p in patterns)
{
foreach (string f in system.io.directory.getfiles(sourcedirectory, p.trim()))
{
this._filescount ++;
this._fileid ++;
if (this.addsearchedfile(f))
{
this._fileuid ++;
}
if (searchedfile != null)
{
onsearchedfile(f, directoryuid, fileuid, this._directoryid, this.fileid, this._currentdestinationdirectoryname);
}
if (this._cancel != cancelactions.no)
{
break;
}
}
if (this._cancel != cancelactions.no)
{
break;
}
}
}
if (this._cancel != cancelactions.alldirectories)
{
this._fileid = 0;
this._directoryid = 0;
foreach (string p in patterns)
{
if (this._cancel != cancelactions.alldirectories)
{
foreach (string d in system.io.directory.getdirectories(sourcedirectory, p.trim()))
{