明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3359|回复: 18

今天无聊,发一个以前的试验品 超快感搜索令 v1.0

  [复制链接]
发表于 2011-5-10 22:12 | 显示全部楼层 |阅读模式
本帖最后由 狂刀lxx 于 2011-5-10 22:14 编辑

今天无聊,发一个以前的试验品 超快感搜索令 v1.0

  1. ;| xdir,(xdir path fn) = 超快感搜索令 v1.0 (函数版)-----ok!!----by lxx.2005.10
  2. 说明: 1. 因为太快了,根本不需要在状态条显示搜索过程!!故名"超快感搜索令".
  3.       2. 参考: c:xfind = 超快感搜索令 v1.0 (对话框版)
  4. 技巧: 1. 应用到 添加acad.pgp并更新re-init技术!
  5.       2. 应用到调用系统选择目录对话框.
  6.       3. 应用到shell参数4不闪屏。
  7.       4. 应用到外部命令: dir /s/b >文件名 取得搜索结果.
  8. 测试:
  9. 命令: xdir
  10. "c:\\WINDOWS\\system32\\Comdlg32.ocx"
  11. 00时00分01.65秒
  12. ;; 8G硬盘.
  13. 命令: xdir
  14. 输入文件名(支持通配符):acad*.lsp
  15. "C:\\Program Files\\LiZheng\\LAr2004\\SYS\\acaddoc.lsp"
  16. "C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
  17. "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
  18. "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
  19. "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
  20. "C:\\a14\\Acad.lsp"
  21. 00时00分01.98秒
  22. |;
  23. ;;命令方式:
  24. (defun c:xdir ()
  25.   (xdir nil nil)
  26.   (princ)
  27. )
  28. ;| 主函数: (xdir path fn) = 超快感搜索令-------by lxx.2005.10
  29. 参数: path = 搜索路径. 当为nil.自动显示系统选择目录对话框(qf_getfolder msg).
  30.       fn   = filename,支持通配符的文件名,如: acad*.lsp .当为nil,自动提示输入.
  31. 返回: 搜索结果列表. 搜索过程显示搜索内容.
  32. |;
  33. (defun xdir (path filename / f a lst)
  34.   ;;(setq path "c:\")
  35.   ;;(setq filename "acad*.lsp")
  36.   (if (not path)
  37.     (setq path (qf_getFolder "选择搜索目录:"))
  38.   )     ;(getfiled "" "" "" 4)
  39.   (if (not filename)
  40.     (setq filename (getstring "\n输入文件名(支持通配符):"))
  41.   )
  42.   (if (and path filename)
  43.     (progn
  44.       (x!-time)
  45.       (x-addpgp "XSHELL, , 4,*OS Command: ," '*xshell*);检测及初始化xshell外部命令
  46.       (command "xshell"
  47.         (strcat "dir " path filename " /s/b >c:\\xdir.tmp")
  48.       )
  49.       (setq f (open "c:\\xdir.tmp" "r"))
  50.       (while (setq a (read-line f))
  51. (setq lst (cons a lst))
  52.       )
  53.       (close f)
  54.       (vl-file-delete "c:\\xdir.tmp")
  55.       (mapcar 'print lst)
  56.       (x!-runtime)
  57.     )
  58.   )
  59.   lst
  60. )
  61. ;|(x-addpgp str) = 在acad.pgp中添加一行内容.
  62. 可用于初始化xshell外部命令
  63. 如果acad.pgp没有以下一行,自行加入。
  64. "XSHELL,,4,*OS Command: ,"
  65. 定义外部命令,参数4为隐藏自行!
  66. 设置后 设全局变量*xshell*为T.第二次运行即可不用打开acad.pgp来判断.
  67. !!!!调用方法:!!!!
  68. (x-addpgp "XSHELL, , 4,*OS Command: ," '*xshell*)
  69. |;
  70. (defun x-addpgp (str key / fn f a k)
  71.   (if (not (eval key))
  72.     (progn
  73.       (setq fn (findfile "acad.pgp"))
  74.       (setq f (open fn "r"))
  75.       (while (and (setq a (read-line f))
  76.     (setq k (/= a str)))
  77.       )
  78.       (close f)
  79.       (if k
  80. (progn
  81.    (setq f (open fn "a"))
  82.    (write-line str f)
  83.    (close f)
  84.    (setvar "re-init" 16) ; reinit acad.pgp !!!!!
  85. )
  86.       )
  87.       (set key T)
  88.     )
  89.   )
  90. )
  91. ;| (x!-time)...(x!-runtime) = 求测试程序运行时间.---ok!---by lxx.2005.10
  92. 说明:  (x!-time)..[过程代码]...(x!-runtime) 配套使用.
  93. |;
  94. (defun x!-time ()
  95.   (setq *x!-time (getvar "cdate"))
  96. )
  97. ;;
  98. (defun x!-runtime ( / tm tm$) ;*x!-time 全局.
  99.   (print)
  100.   (if *x!-time
  101.     (progn
  102.       (setq tm  (- (getvar "cdate") *x!-time)
  103.      tm$ (rtos tm 2 8))
  104.       (mapcar '(lambda(x y / a)(princ (strcat  (setq a (substr tm$ x 2)) y)) a) '(3 5 7 9)  '("时" "分" "." "秒"))
  105.     )
  106.   )
  107. )
  108. ;; (qf_getFolder "")
  109. (defun qf_getFolder (msg / WinShell shFolder path catchit)
  110.   (vl-load-com)
  111.   (setq winshell (vlax-create-object "Shell.Application")); (vlax-dump-object winshell T)
  112.   (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
  113.   (setq
  114.     catchit (vl-catch-all-apply
  115.        '(lambda ()
  116.    (setq shFolder (vlax-get-property shFolder 'self))
  117.    (setq path (vlax-get-property shFolder 'path))
  118.         )
  119.      )
  120.   )
  121.   (if (vl-catch-all-error-p catchit)
  122.     nil
  123.     path
  124.   )
  125. )



"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-5-10 22:15 | 显示全部楼层
灰常好,我原来用程序查找ACAD.LSP ACAD.FAS。不懂要用到几分钟呢
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2011-5-10 22:14 | 显示全部楼层


  1. ;| xdirx = 超快感搜索令 v1.0 (对话框版)-----ok!!----by lxx.2005.10
  2. 说明: 1. 因为太快了,根本不需要在状态条显示搜索过程!!故名"超快感搜索令".
  3.       2. 参考: c:xfind = 超快感搜索令 v1.0 (函数版)
  4. 技巧: 1. 应用到 添加acad.pgp并更新re-init技术!
  5.       2. 应用到调用系统选择目录对话框.
  6.       3. 应用到shell参数4不闪屏。
  7.       4. 应用到外部命令: dir /s/b >文件名 取得搜索结果.
  8.       5. 应用到 自动生成对话框文件并加载 技术. !!!
  9. 测试:
  10. ;; 8G硬盘.
  11. 命令: xfindx
  12. |;
  13. ;;命令方式:
  14. ;;; 主命令:
  15. (defun c:xfindx (/ dcl_id dclfn dd $lst)
  16.   ;检测或生成xfindx.dcl.
  17.   (setq dcl_id (load_dialog (setq dclfn (xdcl-create-xfindx)))) ;加载xfindx.dcl
  18.   (new_dialog "xfindx" dcl_id) ;获得对话框句柄.
  19.   ;;预定义按钮操作.
  20.   (action_tile "getfolder"
  21.     "(set_tile "searchfolder" (qf_getFolder "选择搜索路径:"))")
  22.   (action_tile "accept"
  23.     "(setq folder (get_tile "searchfolder"))
  24.      (setq fname (get_tile "fname"))     
  25.      (if (and folder fname)
  26.          (done_dialog 1)
  27.          (alert "请选择目录,输入搜索文件名。\n通配符如: acad*.lsp|acad*.*")
  28.      )")
  29.   ;; 激活对话框.
  30.   (setq dd (start_dialog))
  31.   (unload_dialog dcl_id)
  32.   (if (= dd 1);由(done_dialog 1)返回的值.
  33.     (if (setq $lst (xdir folder fname))
  34.       (xfinx-get $lst dclfn);选择文件.
  35.       (alert "\n!没有找到!")
  36.     )
  37.   )
  38.   (princ)
  39. )
  40. ;| (xfinx-get $lst dclfn) = 从搜索结果中选择需要的文件,返回列表-----by lxx.2005.10
  41. 参数: $lst = 搜索到的所有文件列表.
  42.       dclfn = 对话框文件.
  43. 返回: 选择到的文件列表.
  44. |;
  45. (defun xfinx-get ($lst dclfn / $runtime dcl_id dd til fns fnss)
  46.   (setq allkey nil til nil)
  47.   (setq dcl_id (load_dialog dclfn))
  48.   (new_dialog "select" dcl_id)
  49.   (start_list "selfn")
  50.   (mapcar 'add_list $lst)
  51.   (end_list)
  52.   (set_tile "runtime" $runtime)
  53.   (action_tile "selfn"
  54.     "(set_tile "selfn" $value)
  55.      (setq fnss (xl-subilst $lst (read(strcat "("(get_tile "selfn") ")"))))
  56.      (print fnss)
  57.     "
  58.   )
  59.   (action_tile "accept"
  60.     "(if fnss
  61.          (done_dialog 1)
  62.          (alert "请选择文件名(可多选)")
  63.      )")
  64.   (action_tile "selall" "(set_tile "selfn" (listall$i $lst))(setq fnss $lst)")
  65.   (action_tile "info" "(alert "狂刀制造 2005.10")")
  66.   ;;激活
  67.   (setq dd (start_dialog))
  68.   (unload_dialog dcl_id)
  69.   (princ "\n 搜索结果:\n")
  70.   (cond
  71.     ((= dd 2)(mapcar 'print fnss));返回所有文件列表.
  72.     ((= dd 1)
  73.           (mapcar (function (lambda (x)
  74.                               (if (member x fnss)
  75.                                 (setq fnss (vl-remove x fnss))
  76.                                 (setq fnss (cons x fnss))
  77.                               )
  78.                             )
  79.                   )
  80.                   fns
  81.           )
  82.           fnss                ;返回选到的文件列表.
  83.     )
  84.   )
  85. )
  86. ;| (listall$i lst) = 取得列表的序号字符串(空格分开).----by lxx.2005.11
  87. (listall$i '(a b c d)) -> "0 1 2 3"
  88. |;
  89. (defun listall$i ($lst / i str)
  90.   (setq str "" i -1)
  91.   (mapcar '(lambda(x)(setq str (strcat str (itoa(setq i(1+ i))) " "))) $lst)
  92.   (vl-string-right-trim " " str)
  93. )
  94. ;|
  95. (xl-subilst lst ilst) = 从ilst序号表提取lst表格元素组新表.
  96. 测试: (xl-subilst '(a b c d e) '(0 2 3)) -> '(A C D)
  97. |;
  98. (defun xl-subilst (lst ilst /)
  99.   (mapcar '(lambda(x)(nth x lst)) ilst)
  100. )
  101. ;| 主函数: (xdir path fn) = 超快感搜索令-------by lxx.2005.10
  102. 参数: path = 搜索路径. 当为nil.自动显示系统选择目录对话框(qf_getfolder msg).
  103.       fn   = filename,支持通配符的文件名,如: acad*.lsp .当为nil,自动提示输入.
  104. 返回: 搜索结果列表. 搜索过程显示搜索内容.
  105. |;
  106. (defun xdir (path filename / f a lst)
  107.   (if (not path)
  108.     (setq path (qf_getFolder "选择搜索目录:"))
  109.   )                                        ;(getfiled "" "" "" 4)
  110.   (if (not filename)
  111.     (setq filename (getstring "\n输入文件名(支持通配符):"))
  112.   )
  113.   (if (and path filename)
  114.     (progn
  115.       (x!-time)
  116.       (x-addpgp "XSHELL, , 4,*OS Command: ," '*xshell*);检测及初始化xshell外部命令
  117.       (command "xshell"
  118.                (strcat "dir " path filename " /s/b >c:\\xdir.tmp")
  119.       )
  120.       (setq f (open "c:\\xdir.tmp" "r"))
  121.       (while (setq a (read-line f))
  122.         (setq lst (cons a lst))
  123.       )
  124.       (close f)
  125.       (vl-file-delete "c:\\xdir.tmp")
  126.       ;(mapcar 'print lst);对话框版本取消本行.
  127.       (setq $runtime (x!-runtime))
  128.     )
  129.   )
  130.   lst
  131. )
  132. ;|(x-addpgp str) = 在acad.pgp中添加一行内容.
  133. 可用于初始化xshell外部命令
  134. 如果acad.pgp没有以下一行,自行加入。
  135. "XSHELL,,4,*OS Command: ,"
  136. 定义外部命令,参数4为隐藏自行!
  137. 设置后 设全局变量*xshell*为T.第二次运行即可不用打开acad.pgp来判断.
  138. !!!!调用方法:!!!!
  139. (x-addpgp "XSHELL, , 4,*OS Command: ," '*xshell*)
  140. |;

  141. (defun x-addpgp (str key / fn f a k)
  142.   (if (not (eval key))
  143.     (progn
  144.       (setq fn (findfile "acad.pgp"))
  145.       (setq f (open fn "r"))
  146.       (while (and (setq a (read-line f))
  147.                   (setq k (/= a str)))
  148.       )
  149.       (close f)
  150.       (if k
  151.         (progn
  152.           (setq f (open fn "a"))
  153.           (write-line str f)
  154.           (close f)
  155.           (setvar "re-init" 16) ; reinit acad.pgp !!!!!
  156.         )
  157.       )
  158.       (set key T)
  159.     )
  160.   )
  161. )
  162. ;| (x!-time)...(x!-runtime) = 求测试程序运行时间.---ok!---by lxx.2005.10
  163. 说明:  (x!-time)..[过程代码]...(x!-runtime) 配套使用.
  164. |;
  165. (defun x!-time ()
  166.   (setq *x!-time (getvar "cdate"))
  167. )
  168. ;;
  169. (defun x!-runtime ( / tm tm$) ;*x!-time 全局.
  170.   (print)
  171.   (if *x!-time
  172.     (progn
  173.       (setq tm  (- (getvar "cdate") *x!-time)
  174.             tm$ (rtos tm 2 8))
  175.       (mapcar '(lambda(x y / a)(princ (strcat  (setq a (substr tm$ x 2)) y)) a) '(3 5 7 9)  '("时" "分" "." "秒"))
  176.     )
  177.   )
  178. )

  179. ;; (qf_getFolder "")
  180. (defun qf_getFolder (msg / WinShell shFolder path catchit)
  181.   (vl-load-com)
  182.   (setq winshell (vlax-create-object "Shell.Application")); (vlax-dump-object winshell T)
  183.   (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
  184.   (setq
  185.     catchit (vl-catch-all-apply
  186.               (function(lambda ()
  187.                  (setq shFolder (vlax-get-property shFolder 'self))
  188.                  (setq path (vlax-get-property shFolder 'path))
  189.                ))
  190.             )
  191.   )
  192.   (if (vl-catch-all-error-p catchit)
  193.     nil
  194.     path
  195.   )
  196. )
  197. ;; 自动生成xfindx.dcl对话框文件,保存在 (getVAR "LOCALROOTPREFIX")目录下.
  198. ;; 返回:文件名: 路径+"xfindx.dcl".
  199. ;; (xdcl-create-xfindx)
  200. (defun xdcl-create-xfindx (/ dclname dlg$lst f)
  201.   (setq        dclname
  202.          (strcat (getVAR "LOCALROOTPREFIX") "xfindx.dcl")
  203.   )
  204.   (setq        dlg$lst
  205.          (list
  206.            "xfindx:dialog{"
  207.              "label="超快感搜索令 v1.0 (对话框版) 狂刀制造------v0510-1.0";"
  208.              ":row{"
  209.              ":edit_box{label="搜索路径:";key="searchfolder";value="c:\\\\";width=40;}"
  210.              ":button {label=" 指定路径 ";key="getfolder";}" "}" ":row{"
  211.              ":edit_box{label="文 件 名:  ";key="fname";value="*.lsp";width=42;}"
  212.              ":button {label="狂搜";key="accept";}"
  213.              ":button {label="退出";is_cancel=true;key="cancel";}"
  214.              "}"
  215.            "}"
  216.            "select:dialog{"
  217.              "label="超快感搜索令 v1.0 (对话框版) 狂刀制造------v0510-1.0";"
  218.              ":text{label="搜索用时:";key="runtime";}"
  219.              ":list_box{label="选择文件:";key="selfn";multiple_select=true;height=20;}"
  220.              ":boxed_row{"
  221.                "label="操作:";"
  222.                ":column{"
  223.                   ":radio_button {label="输出";key="retkey";value=1;}"
  224.                   ":radio_button {label="删除";key="delkey";value=0;}"
  225.                   ":radio_button {label="编辑";key="editkey";value=0;}"
  226.                "}"
  227.                ":column{"
  228.                   ":toggle{label="全选所有选项";key="selall";}"
  229.                   ":row{"
  230.                   ":button {label="编辑程序";key="getexef";}"
  231.                   ":button {label="作者信息";key="info";}"
  232.                 "}"
  233.                ":row{"
  234.                   ":button {label="确定";key="accept";}"
  235.                   ":button {label="退出";key="cancel";is_cancel=true;}"
  236.                 "}"
  237.                "}"
  238.             "}"
  239.           "}"
  240.            )
  241.   )
  242.   (if (not (findfile dclname))
  243.     (progn
  244.       (setq f (open dclname "W"))
  245.       (foreach x dlg$lst (write-line x f))
  246.       (close f)
  247.     )
  248.   )
  249.   dclname
  250. )
发表于 2011-5-10 22:17 | 显示全部楼层
灰常好,我原来用程序查找ACAD.LSP ACAD.FAS。不懂要用到几分钟呢
发表于 2011-5-10 22:32 | 显示全部楼层
本帖最后由 highflybird 于 2011-5-10 22:34 编辑

回复 狂刀lxx 的帖子

好像找不到xshell,是要在你的库中加载么?楼主这次是要精品大奉献了。
另外,关于搜索问题,我以前用过API搜索,也可以达到极致。在我的《CAD 垃圾文件清除工具》中。

发表于 2011-5-10 22:44 | 显示全部楼层
本帖最后由 qjchen 于 2011-5-10 22:46 编辑

:),谢谢狂刀兄的好程序,真是很快
我现在一般都用Everything这个软件来搜索东西,也是快的离谱。
每次重启系统之后打开需要10来秒,之后每次搜索, 500G硬盘都是<0.1秒
它用的方法和狂刀兄的比较类似,不过它应该是读取了ntfs分区内的一个文件索引
 楼主| 发表于 2011-5-10 22:45 | 显示全部楼层
用了  (x-addpgp "XSHELL, , 4,*OS Command: ," '*xshell*);检测及初始化xshell外部命令
没有添加成功么?
发表于 2011-5-10 22:45 | 显示全部楼层
其实我还是希望搜索能支持正则表达式的。那样更好。
发表于 2011-5-10 22:48 | 显示全部楼层
了解,明白
发表于 2011-5-10 22:54 | 显示全部楼层
回复 狂刀lxx 的帖子

while (setq a (read-line f))----在这个地方中断, f的数值为nil

Command: xdir
输入文件名(支持通配符):*.lsp
xshell Unknown command "XSHELL".  Press F1 for help.
Command: dir C:\*.lsp /s/b >c:\xdir.tmp Unknown command "DIR C:\*.LSP /S/B
>C:\XDIR.TMP".  Press F1 for help.
Command: ; error: bad argument type: FILE nil
; reset after error
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-1 22:49 , Processed in 0.431696 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表