首页 > 代码库 > 硬盘全文检索工具

硬盘全文检索工具

需要解决的几个问题:

1、硬盘文件检索

2、多线程

3、word打开超时或者出现异常情况

 

第一个问题,用的是递归方法,深度优先。据查资料,有个api命令"FindFirstFile"、"FindNextFile",可以更高效地列出所有目录,速度很快,没有进行深入研究

第二个问题,使用的是manage,可以很方便地管理线程的执行情况,快速暂停、恢复

第三个问题,采用com方式打开文档,只要电脑上可以打开,就没有问题啦。效率可能不是太高,暂时还没有找到更好的办法。打开的时候,给word命名一个guid的名称,然后传递给生成的一个监控线程,看执行了多少时间,如果超过指定时间,就通过api找到句柄,强行关闭word文档。

 

其他的代码,就没有什么含量了。

 

主界面代码

import win.ui;import fsys;import string;import thread.manage;import thread.command;/*DSG{{*/mainForm = ..win.form(text="FindDisk";right=536;bottom=407;border="dialog frame";max=false;mode="popup")mainForm.add(button={cls="button";text="选择目录";left=441;top=19;right=512;bottom=43;z=5};button2={cls="button";text="开始";left=398;top=55;right=451;bottom=79;z=6};button3={cls="button";text="暂停";left=458;top=55;right=511;bottom=79;z=7};edit={cls="edit";text="关键字|关键字";left=73;top=57;right=390;bottom=80;edge=1;z=4};edit2={cls="edit";left=73;top=19;right=434;bottom=42;edge=1;z=9};groupbox={cls="groupbox";text="配置";left=12;top=1;right=524;bottom=92;edge=1;z=2};listview={cls="listview";left=12;top=98;right=524;bottom=389;bgcolor=16777215;edge=1;z=1};static={cls="static";text="关键字";left=28;top=61;right=69;bottom=79;transparent=1;z=3};static2={cls="static";text="目 录";left=28;top=23;right=69;bottom=41;transparent=1;z=8};static4={cls="static";left=9;top=391;right=530;bottom=407;font=LOGFONT( h=-10 );nWrap=1;transparent=1;z=10})/*}}*/var sdir;var keyword;//创建线程管理器var manage = thread.manage()//获取待检索目录mainForm.button.oncommand = function(id,event){    import fsys.dlg        mainForm.edit2.text = fsys.dlg.opendir()}//开始检索mainForm.button2.oncommand = function(id,event){    sdir = mainForm.edit2.text;    if( ! io.exist(sdir) )     {        mainForm.msgbox("请选择有效目录!")        return ;    }        mainForm.button2.disabled = true;    keyword = mainForm.edit.text        manage.create(         function(arg) {            import thread.works;            import myfun;                        var sdir = arg.sdir;            var key = arg.key;            var tcount = arg.tcount;                        myfun.search(sdir,key)        },        {sdir=sdir;key=keyword;}    )}mainForm.button3.oncommand = function(id,event){    if(mainForm.button3.text=="暂停"){        mainForm.button3.text = "恢复"        manage.suspend()    }    else{        mainForm.button3.text = "暂停"        manage.resume()    }}mainForm.listview.insertColumn("文件路径",400,,)import mouse;import win.uiimport win.ui.menu;import win.util.tray;import process;mainForm.popmenu = win.ui.popmenu(mainForm);//创建弹出菜单mainForm.popmenu.add(‘定位‘,function(id){    //在下面输入菜单响应代码    var index = mainForm.listview.selIndex;    var path = mainForm.listview.getItemText(index,1)    process.explore_select(path)});mainForm.listview.onnotify = function(id,code,ptr){        select(code) {        case 0xFFFFFFFB/*_NM_RCLICK*/  {            var x,y = mouse.getPos()            mainForm.popmenu.popup(x,y,true);//弹出菜单        }    }    }//消息响应函数var listener = thread.command()listener.print = function(...){    mainForm.static4.text = ...;}listener.add = function(...){    mainForm.listview.addItem({...})}listener.log = function(...){    file = io.open("\log.txt","a+");    file.write(...+‘\r\n‘)    file.close()}mainForm.show() win.loopMessage(); //安全终止线程manage.quitMessage()manage.waitClose() 

myfun工具函数代码

namespace myfun{    //遍历目录开始    search = function(folder,keyword){        import fsys;        import io;        import thread.command        import string;                //目录不存在,就返回        if( !io.exist(folder) ){            return ;        }                        var exts = "txt|asp|jsp|php|xml|doc"  //支持的文件类型                fsys.enum(folder, "*.*",            function(dir,filename,fullpath,findData){                 if(!filename){                     search(fullpath,keyword)                    thread.command.print("正在扫描目录:"+fullpath)                    sleep(100)                }                else{                    thread.command.print("正在处理文件:"+fullpath)                                        var extindex = string.lastIndexAny(fullpath,".")                    var ext = string.sub(fullpath,extindex+1);                    ext = string.lower(ext)                                        var content = null;                    if( string.find(ext,"doc") ){                        content = getdoccontent(fullpath)                    }else if( checkexts(ext,exts) ){                        content = gettxtcontent(fullpath)                    }                                        if( haskey(content,keyword) == true )                    {                        thread.command.add(fullpath);                    }                    sleep(100)                }            }             ,false        );    }    //遍历目录结束        haskey = function(content,keys){        if( content == null)            return false;        var tab = string.split(keys,"|")        for(i=1;#tab;1){            if( string.find(content,tab[i]) )                return true                }        return false;            }                //判断是否为支持的文件类型开始    checkexts = function(ext,exts){        import string;                var tab = string.split(exts,"|")                for(i=1;#tab;1){            if( string.find(ext,tab[i]) )            {                return true;                    }        }        return false;            }        //判断是否为支持的文件类型结束        //获取文本格式内容开始    gettxtcontent = function(path){        import fsys.codepage                if( !io.exist(path)    )            return ""        else            return fsys.codepage.load(path);    }    //获取文本格式内容结束        //获取word内容开始    getdoccontent = function(...){        import fsys;        import thread;        import thread.command;        import win.guid;        import string;        import io;                //获取com组件开始        getobj = function(){            import com                        var msobj = null;            var wpsobj = null;            try{                wpsobj = ..com.CreateObject("WPS.Application")            }            if(!wpsobj){                try{                    msobj = com.CreateObject("Word.Application")                }            }            if( wpsobj)                return wpsobj,"wps";            else if(msobj)                return msobj,"word";            else{                return null,"";            }        }        //获取com组件结束                getcontent = function(path){            var guid = win.guid.create()                        var filenameindex = string.lastIndexAny(path,"\")            var filename = string.sub(path,filenameindex);                        //不处理word临时文件            if(string.match(filename,"^<\~\$>")){                return null;            }                                    var doc,content = null;            var obj,otype = getobj();                                    try{                if(obj){                    obj.Visible = false                    obj.DisplayAlerts = false                    obj.Caption = tostring(guid)                                        //监控doc运行时间开始                    //如果文档打开时间超过 existtime,则强行关闭                    thread.create(                        function( ... ){                            import win;                                     import process;                            import winex;                                                        var existtime = 5;                            sleep( existtime *1000)                            handle,tid,pid = winex.find(,...)                                                        if(handle)                                process(pid).kill();                        },                        guid                    )                    //监控运行时间开始                                        doc = obj.Documents.Open(path,false,true,false,"123")   //随便给个密码,以防部分带密码文档弹出输入框                    if(!doc){                        return null;                    }                    content = obj.ActiveDocument.Content.text;                }                else{                                    thread.command.log("系统没有安装wps或者word,"+path+" 文件无法打开")                }                                if(doc)                    doc.close()                if(obj)                    obj.close()            }            catch(e)            {                thread.command.log(path+" 文件打开异常")                return null;                            }            return content;                    }                return  getcontent(...);     }        //获取word内容结束}

 

硬盘全文检索工具