jdhszh 发表于 2006-6-27 08:40:00

如何穷尽文件夹

有时文件夹里有很多文件都是汇总来的,文件名千奇百怪,我想用LISP方法把它们都改为大写或小写,可文件夹里又有很多子文件夹,如何穷尽文件夹,以下是我写的一断程序它只能执行到目录的下一级目录,再往下就解决不了
望高手赐教;;文件夹内文件夹及文件名统改大写
(defun C:GWJDX (/ bbp mb mb1 newm i)
(setq bbq (qf_getFolder "选择文件夹:"))
(if bbq
(progn
   (setq bbp (vl-directory-files bbq))
   (setq bbp (cdr (cdr bbp)))
   (setq i 0)
   (repeat (length bbp)
    (setq mb (nth i bbp))
    (setq mb1 (strcat bbq "\\" mb))
    (if (vl-file-directory-p mb1) (gml mb1))
    (setq newm (strcase mb))
    (vl-file-rename mb1 (strcat bbq "\\" newm))
    (setq i (1+ i))
)
)
(princ "没有选中文件夹!")
)
(princ)
)
;;
(defun gml(mb1)
(setq mlf (vl-directory-files mb1))
(setq mlwj(cdr (cdr mlf)))
(setq a 0)
(repeat (length mlwj)
   (setq xwj(nth a mlwj))
   (setq qxwj(strcat mb1 "\\" xwj))
   (setq xwjm(strcat mb1 "\\" (strcase xwj)))
    (vl-file-rename qxwj xwjm)
    (setq a(1+ a))
    )
)
;;qf_getFolder 引至明经社区
(defun qf_getFolder (msg / WinShell shFolder path catchit)
(vl-load-com)
(setq winshell (vlax-create-object "Shell.Application"))
(setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
(setq
    catchit (vl-catch-all-apply
      '(lambda ()
(setq shFolder (vlax-get-property shFolder 'self))
(setq path (vlax-get-property shFolder 'path))
       )
    )
)
(if (vl-catch-all-error-p catchit)
    nil
    path
)
)

liu_kunlun 发表于 2006-6-27 17:39:00

本帖最后由 作者 于 2006-6-28 8:02:19 编辑 <br /><br /> <P>采用递规,编程思路如下:其中vtype是判断是文件还是目录,需另外定义.(getfilesb dir)为读取dir中的文件和目录成表,也需另外定义</P>
<P>(defun getfiles (dir / out)</P>
<P>&nbsp;&nbsp;&nbsp; (getfilesa dir)</P>
<P>&nbsp;&nbsp; &nbsp;out</P>
<P>)</P>
<P>(defun getfilesa (dir /&nbsp;files )</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; (cond</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp;&nbsp; (= 'file (vtype dir)) (setq out (cons dir out)))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; &nbsp;(= 'dir (vtype dir))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (setq files (getfilesb dir))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;(mapcar 'getfilesa files)</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( t )</P>
<P>)&nbsp;&nbsp;&nbsp; )</P>

jdhszh 发表于 2006-6-28 16:55:00

老大不行啊,想法很好但办不到,再帮忙看看给点具体的。

liu_kunlun 发表于 2006-6-28 17:57:00

本帖最后由 作者 于 2006-6-29 10:20:58 编辑 <br /><br /> <P>(defun getfiles (dir / out)<BR>&nbsp;&nbsp;&nbsp; (getfilesa dir)<BR>&nbsp;&nbsp;&nbsp; out<BR>)<BR>(defun getfilesa (dir / files )<BR>&nbsp;&nbsp;&nbsp;&nbsp; (cond<BR>&nbsp;&nbsp; (&nbsp;&nbsp; (null dir))<BR>&nbsp;&nbsp; (&nbsp;&nbsp; (vl-file-directory-p dir)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (setq files (vl-directory-files dir))<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq files (vl-remove&nbsp; "."&nbsp; files))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq files (vl-remove&nbsp; ".."&nbsp; files))<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mapcar 'getfilesa (mapcar '(lambda (x) (strcat dir "/" x)) files))<BR>&nbsp;&nbsp; )&nbsp;&nbsp; )&nbsp;&nbsp; )&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp;&nbsp; t (setq out (cons dir out)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>)&nbsp;&nbsp;&nbsp; )</P>

jdhszh 发表于 2006-6-29 15:58:00

谢谢!!这次可以了
页: [1]
查看完整版本: 如何穷尽文件夹