明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 764|回复: 4

[源码] LISP非递归深度遍历文件夹查找文件

[复制链接]
发表于 2024-7-10 10:13:31 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2024-8-28 22:41 编辑

见过一些递归的查找文件,我来一个非递归的,我想不到递归怎么写,代码如下:

  1. (defun $lie-chu-mu-lu-xia-suo-you-wen-jian$
  2.        (lst / a f fs fs-all kzm n ns ns-1 wj wjs)
  3.                                         ;列出目录下所有文件,含子级目录,所有目录下的文件
  4.   ;($lie-chu-mu-lu-xia-suo-you-wen-jian$(list(cons "目录" "C:\\uploads")(cons "扩展名" "*.dwg")))
  5.   (or (and lst
  6.            (= (type lst) 'list)
  7.            (setq kzm (cdr (assoc "扩展名" lst)))
  8.            (> (strlen kzm) 0)
  9.            (wcmatch kzm "[,`*.*,]")
  10.       )
  11.       (setq kzm "*.*")
  12.   )
  13.   (or (and lst
  14.            (= (type lst) 'list)
  15.            (setq f (cdr (assoc "目录" lst)))
  16.       )
  17.       (and lst (= (type lst) 'str) (setq f lst))
  18.   )
  19.   (and
  20.     f
  21.     kzm
  22.     (findfile f)
  23.     (progn
  24.       (while (and f (wcmatch f "*`\\*"))
  25.         (setq f (vl-string-subst "/" "\\" f))
  26.       )
  27.       (setq fs-all nil)
  28.       (setq fs-all (cons f fs-all))
  29.       (setq fs (vl-directory-files f "*.*" -1))
  30.       (setq fs (vl-remove ".." fs))
  31.       (setq fs (vl-remove "." fs))
  32.       (setq fs (mapcar (function (lambda (a) (strcat f "/" a))) fs))
  33.       (setq fs-all (APPEND fs-all fs))
  34.       (while (AND fs (setq f (last fs)) (< (length fs-all) 10000))
  35.         (setq ns nil)
  36.         (setq ns (vl-directory-files f "*.*" -1))
  37.         (setq ns (vl-remove ".." ns))
  38.         (setq ns (vl-remove "." ns))
  39.         (while (setq a (car ns))
  40.           (setq n (strcat f "/" a))
  41.           (setq fs (cons n fs))
  42.           (setq fs-all (cons n fs-all))
  43.           (setq ns (cdr ns))
  44.         )
  45.         (setq fs (reverse (cdr (reverse fs))))
  46.       )
  47.       (and fs-all
  48.            (progn
  49.              (setq wjs nil)
  50.              (while (setq a (car fs-all))
  51.                (setq wj nil)
  52.                (setq wj (vl-directory-files a kzm 1))
  53.                (setq wj (vl-remove ".." wj))
  54.                (setq wj (vl-remove "." wj))
  55.                (setq
  56.                  wj (mapcar (function (lambda (b) (strcat a "/" b))) wj)
  57.                )
  58.                (setq wjs (cons wj wjs))
  59.                (setq fs-all (cdr fs-all))
  60.              )
  61.              (setq wjs (vl-remove nil wjs))
  62.            )
  63.       )
  64.     )
  65.   )
  66.   wjs
  67. )


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-7-10 11:33:26 | 显示全部楼层
不错,不错。学习到了。要是可以选择包含“某些字符”就更好了。
发表于 2024-7-10 12:56:44 | 显示全部楼层
thanks for sharing ... learning
发表于 2024-7-10 19:42:28 | 显示全部楼层
感谢杜总的分享!
发表于 2024-7-18 22:08:46 | 显示全部楼层
谢分享,受益非&#15552;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-22 16:18 , Processed in 0.182390 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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