明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2620|回复: 11

[源码] 另类高速历遍指定目录下所有子目录[调用系统tree命令]

  [复制链接]
发表于 2016-3-20 21:19 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2016-3-27 18:36 编辑

在历遍目录下所有子目录的大部分方法,对于多层大数量的情况一般耗时都非常长,我通过调用CMD下的tree命令来读取,可以极大的提高速度,虽然代码繁琐,但是速度却提高了5倍以上,我历遍了自己的整个C盘只耗时7秒左右
  1. (defun try-tree(pathx / data ff file m m0 n nn path path-lst tem tou tou1 tou2 zhan)
  2.   (setq file (vl-filename-mktemp "try.txt"));临时文件名
  3.   (command "SHELL"  (strcat "tree " """ pathx "" >"file "&echo shop>>"file));生成文件
  4.   (while (/= (_read_last file) "shop"));等待文件生成成功
  5.   (setq ff (open file "R");读取文件
  6.     data (read-line ff);读取第一行
  7.     tem(substr data 1 2);取得第一个字符
  8.   )
  9.   (while (/= tem "├");判断是否到了真正开始的位置
  10.     (setq data (read-line ff)tem(substr data 1 2))
  11.   )
  12.   (setq
  13.     m0 -1;原始级数为-1,第一个目录为0
  14.     path-lst'();存放最终结果
  15.     zhan(list "");栈,修改此处可以加上目录前缀
  16.   )
  17.   (while data
  18.     (setq tou(try-StringSplit data "├─"));分隔
  19.     (if (= (length tou)1) (setq tou(try-StringSplit data "└─")));
  20.     (if (> (length tou)1)
  21.       (progn
  22.         (setq tou1(try-StringReplace (car tou) "|" "  ");把目录前面的|替换成两个空格
  23.           tou2 (strcat (cadr tou) "\"));把目录加上\
  24.         (setq n(strlen tou1);目录前面的空格数量
  25.           m(/ n 4);空格数量除以4=m级数
  26.         )
  27.         (setq path
  28.           (cond
  29.             ((= m m0);跟上一个目录同级
  30.               (setq zhan(cons tou2 (cdr zhan)));删掉栈的第一个后把目录入栈
  31.               (apply 'strcat (reverse zhan));把栈合并成一个字符串
  32.             )
  33.             ((> m m0);级数大于上一个目录
  34.               (setq zhan(cons tou2 zhan);把目录入栈
  35.                 m0 m);修改m0的级别
  36.               (apply 'strcat (reverse zhan));合并栈
  37.             )
  38.             ((< m m0);级数小于上一个目录
  39.               (setq nn(- m0 m -1)
  40.               zhan(try-lst-move-head zhan nn);删掉栈的前n+1个
  41.               zhan(cons tou2 zhan);把目录入栈
  42.               m0 m);修改m0的级别
  43.               (apply 'strcat (reverse zhan));合并栈
  44.             )
  45.           ))
  46.         (setq path-lst(cons path path-lst));目录入表
  47.       )
  48.     )
  49.     (setq data (read-line ff));读取下一行
  50.   )
  51.   (close ff)
  52.   (reverse path-lst)
  53. )
  54. ;;读取文件的最后一行
  55. (defun _read_last(file / data ff la)
  56.         (setq ff (open file "R"))
  57.         (if ff
  58.                 (progn(while (setq data (read-line ff))
  59.                                                 (setq la data)
  60.                                         )
  61.                         (close ff))
  62.         )
  63.         la
  64. )
  65. (defun try-StringSplit(str char / a b i )
  66.         (if (= "" char)(_Str2List str)
  67.                 (progn
  68.                         (while (setq i(vl-string-search char str))
  69.                                 (setq a(substr str 1 i)
  70.                                         b(cons a b)
  71.                                         str(substr str (+ i (strlen char)1)))
  72.                         )
  73.                         (reverse(cons str b))
  74.                 )
  75.         )
  76. )
  77. (defun _Str2List(str / a);注:引用73的函数
  78.   (setq str(vl-string->list str))
  79.   (while
  80.                 (if(<(car str)129)
  81.                         (setq a(cons(chr(car str))a)str(cdr str))
  82.                         (setq a(cons(strcat(chr(car str))(chr(cadr str)))a)str(cddr str))))
  83.   (reverse a)
  84. )
  85. (defun _Str2List(str / a);注:引用73的函数
  86.   (setq str(vl-string->list str))
  87.   (while
  88.                 (if(<(car str)129)
  89.                         (setq a(cons(chr(car str))a)str(cdr str))
  90.                         (setq a(cons(strcat(chr(car str))(chr(cadr str)))a)str(cddr str))))
  91.   (reverse a)
  92. )
  93. (defun try-lst-move-head (lst i)
  94.     (if (<= i 0)lst
  95.         (repeat i (setq lst (cdr lst))))
  96. )
  97. (defun try-StringReplace(str a b)
  98.   (if(and(setq 论坛抽风这句代码发不出(= 'str (type str)))
  99.              (apply'and(mapcar'(lambda(x)(=(type x)'str))(setq a(if(=(type a)'list)a(list a)))))
  100.              (apply'and(mapcar'(lambda(x)(=(type x)'str))(setq b(if(=(type b)'list)b(mapcar'(lambda(x)b)a))))))
  101.     (setq str(_strsplit str a nil)
  102.             str(apply'strcat(mapcar'strcat(car str)(mapcar'(lambda(x)(if(=""x)x(nth(vl-position x a)b)))(last str)))))
  103.     str))

  104. (setq lst-path(try-tree "C:\"))


注:代码跟附件的内容是一样的,不过附件多了一点点注释,不知道为什么,发源码一直提示非法参数,然后我试着把注释删掉一下,就通过了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 赞一个!
jltx123456 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-3-25 14:25 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
发表于 2017-10-25 19:49 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
发表于 2017-10-4 15:56 | 显示全部楼层
感谢楼主的无私分享 谢谢
发表于 2016-3-21 20:04 | 显示全部楼层
函数呢?_strsplit
发表于 2016-3-21 22:19 来自手机 | 显示全部楼层
感谢楼主的无私奉献!好好研究和学习,谢谢!来自: Android客户端
 楼主| 发表于 2016-3-22 10:09 | 显示全部楼层
wzg356 发表于 2016-3-21 20:04
函数呢?_strsplit

不好意思,缺了一个LLSheng_73的函数,主贴已经更新
  1. ;;超级字符串分割
  2. ;;用一个表对字符串进行分割,返回两个表
  3. ;;表1:分割后的字符串表
  4. ;;表2:被分割的字符串表
  5. ;(_STRSPLIT "12+34分隔35-454,22,33-45" '("+""-""*"","";"" ""=""分隔") nil)
  6. ;==>(("12" "34" "35" "454" "22" "33" "45") ("+" "分隔" "-" "," "," "-" ""))
  7. (defun _strsplit(str splits f / i a b l );;BY:LLSheng_73
  8.   (if f(setq str(vl-list->string(vl-remove 32(vl-string->list str)))))
  9.   (while(<""str)
  10.     (if(vl-remove'nil(mapcar'(lambda(x)(vl-string-search x str))splits))
  11.       (setq i(car(vl-sort(vl-remove'nil(mapcar'(lambda(x)(if(setq l(vl-string-search x str))(cons l x)))splits))
  12.                                                                          '(lambda(s1 s2)(<(car s1)(car s2)))))
  13.                                 a(cons(substr str 1(car i))a)b(cons(cdr i)b)
  14.                                 str(substr str(+(car i)(strlen(cdr i))1)))
  15.       (setq a(cons str a)b(cons "" b)str"")))
  16.   (list(reverse a)(reverse b)))
发表于 2016-3-26 07:49 | 显示全部楼层
TRY-STRINGREPLACE
函数呢?
 楼主| 发表于 2016-3-27 18:37 | 显示全部楼层
crtrccrt 发表于 2016-3-26 07:49
TRY-STRINGREPLACE
函数呢?

论坛抽风,这个函数发不了,最后没办法改了下源码
发表于 2016-4-5 18:43 | 显示全部楼层
支持一下 看看
发表于 2016-5-3 14:04 | 显示全部楼层
这个看看好用不
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 13:47 , Processed in 0.335780 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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