需要解决的几个问题:
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.ui import 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内容结束 }
时间: 2024-12-16 08:16:17