硬盘全文检索工具

需要解决的几个问题:

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

硬盘全文检索工具的相关文章

讯搜全文检索工具学习笔记

学习使用全文检索工具后,做一个小结. 其实这个工具用起来非常简单,只需要花几个小时专心阅读完开发手册就可以进入开发阶段了. 讯搜全文检索工具(Xunsearch) 首先它是一款开源的工具,和其它的开源工具一样,简单易用而且功能强大,并且性能也非常卓越. 分词与索引,是全文检索工具的关键. 讯搜底层采用 C/C++ 编写,索引设计基于著名而悠久的 Xapian,分词采用 自主研发同样也是开源的 SCWS分词,两者完美结合,理论上单个搜索库支持 40 亿条 记录.可编译运行于 Linux/FreeB

PHP+MYSQL实现全文检索及全文检索工具

使用分词类库,分词类库请参见:http://www.xunsearch.com/scws/ 如何使用PHP实现全文检索功能? 很多人可能马上可以想出几种方案,比如:文件检索法.采用SQL的like语句等方法,但这些方法效率都相当的低. 这里介绍一种比较高效的PHP全文检索实现方法,这就是采用MYSQL的FULLTEXT字段类型.但是MYSQL的FULLTEXT字段对中文的支持不是很好,本文也一并介绍如何通过PHP+MYSQL实现中文全文检索功能. 首先需要用到一个PHP中文分词扩展模块--SCW

【安卓笔记】硬盘缓存工具类的编写

DiskLruCache(https://github.com/JakeWharton/DiskLruCache)想必大家都很熟悉.(不熟悉的请看这里),它是jakewharton大神写的一个开源库,提供了硬盘缓存的方案. 但是该库的API比较简单,有时候并不能满足我们使用.比如说如果你想把缓存中的数据以Bitmap的形式返回,API并没有提供这样的方法,我们必须通过DiskLruCache#get方法返回来的Snapshot获得输入流,然后将流转化为Bitmap.另外,构建DiskLruCac

SSD固态硬盘检测工具AS SSD参数

一. 使用AS SSD Benchmark进行查看 包括了4个方面的测试(顺序读写.4K随机读写.64线程4K读写.寻道时间) AS SSD的主要测试,也是网上最常见得到测试成绩的,是它主界面上持续.随机.存取时间等8个相关测试,另外还有压缩和文件复制测试.下面我们开始简单为大家讲解下AS SSD每个测试的方式. 首先是持续测试(Seq),AS SSD会先以16MB的尺寸为单位,持续向受测分区写入生成1个达到1GB大小的文件,然后再以同样的单位尺寸读取这个,最后计算平均成绩而给出结果.测试一完毕

(转)硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍

场景:最近在学习Linux的基础知识,不可避免的设计到Linux的磁盘分区,以前做过总结,但是那种总结就是复制别人的文章,总结完就不想看第二遍,所以很容易就遗忘了!清楚明白的理解分区后,我就可以在自己的电脑上随意操作了! 1 主分区 我们知道硬盘的第一个扇区也就是第0扇区是用来存放主引导记录(MBR)的,因此也称MBR扇区. 一个扇区是512字节,因此MBR的大小也是512字节,其具体数据结构是:446个字节的引导代码.64个字节的分区表及2个字节的签名值"55AA". 由于MBR的分

硬盘分区工具分区安装与使用

双击运行 一步一步 点击下一步 选择安装位置选择下一步 点击下一步 点击安装 2.借助工具进行分盘操作 分区 本文操作 将 D 盘分两个盘,E盘100G 选择合并分区,将未分配的空间添加到E 盘 调整好后点击提交 点击执行 原文地址:https://www.cnblogs.com/obge/p/11689519.html

硬盘管理工具介绍:smartctl

一.安装命令 [[email protected] scripts]# smartctl --all /dev/sda -bash: smartctl: 未找到命令 [[email protected] scripts]# yum search smartctl -y 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.

python 开源全文检索工具 Whoosh

About Whoosh Whoosh is a fast, featureful full-text indexing and searching library implemented in pure Python. Programmers can use it to easily add search functionality to their applications and websites. Every part of how Whoosh works can be extende

EASEUS Partition Manager 最好的硬盘分区工具

可以删除或者格式化分区,还可以重新设置大小以及移动你的分区.如果你没有了任何自由的磁盘空间,你可以减小现有分区的尺寸,然后使用未分配的磁盘空间创建新的或者扩大分区以便更好地管理你的数据.此外,你可以浏览磁盘和分区的属性,设置一个活动分区,改变盘符等.EASEUS Partition Manager 可以从Windows 内部运行,并且还包括一个用于创建可启动光盘的选项,允许你在 Windows 被载入(某些改变或许需要)之前管理你的分区. 这里减少F盘的空间,并用减少的空间来新建一个H盘: 注意