dilan 发表于 2022-7-5 15:40:02

删除文件、目录或文件夹

大家好!
在我的电脑上的临时文件夹中,我有。txt文件。
我知道他们的名字和位置,如何使用lsp删除他们?
我本以为我自己可以写一个程序,但后来我明白我不能管理。
我首先需要获得用户名:
(setq username (getenv "username"))
但在这一点上,我停了下来。。。。我没有足够的知识来完成它((
我决定申请专家

BIGAL 发表于 2022-7-5 15:44:56

批处理文件更简单,可以在Autocad外部运行。将其保存到c:\作为deltext。bat在windows中,只需在左下方的正方形中键入c:\deltext作为命令。是的,您也可以在Autocad中运行。
 

c:
cd \temp
del *.txt

 
如果lisp程序的一部分和你的写作说的是临时文件,那么使用(vl file delete filename),但每次只能使用一个文件。

dilan 发表于 2022-7-5 15:48:49

 
谢谢你,比格尔
我将尝试使用第二个选项

rlx 发表于 2022-7-5 15:52:05

欢迎来到Caddutor Dilan
 
 
快速复制并粘贴在一起,只是为了好玩,几乎没有测试。但对于文件操作来说,存在像Total Commander等漂亮的工具。
 
 



; http://www.cadtutor.net/forum/showthread.php?102517-Delete-files-directory-or-folder-on-your-computer-using-Lsp
; written by RLX for Dilan 9 jan 2018
(defun c:Delete_Dilan ( / folder extension file file-list )
(vl-load-com)
(if (and (setq extension "*.txt" folder (GetFolder "Select folder with txt files"))
   (vl-consp (setq file-list (vl-directory-files folder extension 1)))
   (vl-consp (setq file-list (Tokkie folder extension file-list file-list)))
   (vl-consp (setq file-list (mapcar '(lambda (x)(strcat folder "\\" x)) file-list))))
   (foreach file file-list (vl-file-delete file))
)
(princ)
)
; test (setq fldr (GetFolder "Who , what , Where?"))
(defun GetFolder ( msg / sh objFolder objParentFolder strPath)
(setq sh (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ))
(setq objFolder (vlax-invoke sh 'BrowseForFolder 0 msg 0 ""))
(if objFolder
(and
    (setq strTitle (vlax-get objFolder "Title"))
    (setq objParentFolder (vlax-get objFolder 'ParentFolder))
    (setq strPath (vlax-get (vlax-invoke objParentFolder "Parsename" strTitle) "Path"))
    (vlax-release-object objParentFolder)
    (vlax-release-object objFolder))
(vlax-release-object sh)
)
strPath
)
(defun pimp_list ( %lst / i imax slim)
; stringlimit (emperical), uppercase is bigger , but so are many M's or W's
(if (= #RlxBatch-ShowUpperCaseNames "1") (setq slim 82)(setq slim 95))
(if (or (void RlxBatch-UseTempProjectList) (= RlxBatch-UseTempProjectList "0"))
   (progn
   (setq i 0 imax (strlen (itoa (length %lst))))
   (mapcar '(lambda (x) (setq i (1+ i)) (strcat (fixitoa i imax) " - " (limitstring x slim))) %lst)
   )
   ; this option retains number of position in (main) project list for item in sub project list
   (progn
   (setq imax (strlen (itoa (length RlxBatch-ProjectList))))
   (mapcar
'(lambda (x) (strcat (fixitoa (1+ (vl-position (strcase x t) RlxBatch-ProjectList)) imax) " - " (limitstring x slim)))
%lst
   )
   )
)
)


; s = string , n = max string length
(defun limitstring ( s n / l)
(setq l (strlen s)) (if (> l n) (strcat (substr s 1 (- (/ n 2) 7 )) " . . . " (substr s (- l (/ n 2)))) (strcat s "")))


;check if item is nil of empty string (5 spaces deep)
(defun void (x) (if (member x (list "" " " "" "   " "    " "   " nil '())) t nil))


; make sure itoa has fixed length , i.e. (fixitoa 1 3) -> "001"
(defun fixitoa ( #i #n / s ) (setq s (itoa #i))(while (> #n (strlen s))(setq s (strcat "0" s))) s)

;--- Tokkie ------------------------------------------------------Tokkie ------------------------------------------------------- Tokkie ---
; alternative for listbox multiple selection, a lot of trouble (and not necessarily better) , just different
; $txt1 & 2 = header text 1 & 2 , %lst% list of strings, %plist = pre-selected list of strings (if any)
; (Tokkie "Block1" "Attributes for visibility2" '("a1" "a2" "a3") '("a2"))
; this means toggle for "a1" & "a3" are "0" (off) and "a2" is on ("1")
; if previous list is empty all toggles will have default "0" (this differs from my original smartlist routines)
; also different is pretty-list , designed to limit string length of members in the list
(defun Tokkie ( $txt1 $txt2 %lst %plist / err fn fp dcl nof-tog cur-tog pretty-list tokkie-list slider-index return)
(Tokkie_Init)
(Tokkie_Dialog)
(Tokkie_Exit)
(terpri)
(reverse return)
)
(defun Tokkie_Init ()
;(setq err *error* *error* Tokkie_err)
(cond
   ((not (setq fn (vl-filename-mktemp "Tokkie.dcl"))))
   ((not (setq fp (openfn "w"))))
   ((null %lst))
   ; tokkie-list keeps toggle value (default "1") for each member in %lst
   (t (setq nof-tog (length %lst) pretty-list (pimp_list %lst)))
)
; tokkie list holds default for toggles - (chr 49) = "1" , (chr 48) = "0"
(if (and (not (null %lst)) (not (null %plist)))
   ; if item is found in both argument lists , set toggle on ("1") else off ("0")
   (setq tokkie-list (mapcar '(lambda (x)(if (member x %plist)(chr 49)(chr 48))) %lst))
   ; if empty or no preset list was provided all tokkies are off
   (setq tokkie-list (mapcar '(lambda (x) (chr 48)) %lst)))

(if (null %lst)
   (progn (alert "Nothing to show")(Tokkie_Exit))
   (progn
   (Tokkie_write_header)
   (if (<= nof-tog 10)(Tokkie_write_body1 pretty-list)(Tokkie_write_body2 pretty-list))
   (Tokkie_write_footer)
   )
)
(if fp (close fp))(gc)
(setq slider-index 0)
)
(defun Tokkie_err (s) (princ s)(Tokkie_Exit)(princ))
(defun Tokkie_Exit ()
;|(setq *error* err)|; (if fp (close fp)) (if dcl (unload_dialog dcl))(if (and fn (findfile fn))(vl-file-delete fn)))

(defun Tokkie_write_header ()
(write-line
   (strcat
   "Tokkie:dialog{label=\"Tokkie - Rlx(2017)\";spacer;spacer;"
   ":text_part {key=\"txt1\";width=100;fixed_width=true;}"
   ":text_part{key=\"txt2\";width=100;fixed_width=true;}spacer;") fp))

(defun Tokkie_write_body1 ( %l / i )
(write-line ":boxed_column{" fp)
(setq i 0)
(mapcar '(lambda (x)
   (write-line
       (strcat
":row{spacer;:toggle{key=\"tg" (itoa i) "\";width=2;fixed_width=true;}"
":text_part{key=\"tp" (itoa i) "\";label=\"" x "\";width=100;fixed_width=true;}}") fp)
   (setq i (1+ i)))
%l
)
(repeat (- 10 i)(write-line ":row{height=1.5;}" fp))
(write-line "}spacer;" fp)
)
(defun Tokkie_write_body2 ( %l / i )
(write-line ":boxed_row {:column{" fp)
(setq i 0)
(repeat 10
   (write-line
   (strcat
":row { spacer; :toggle { key =\"tg" (itoa i) "\";width=2;fixed_width=true;}"
":text_part{key=\"tp" (itoa i) "\";label=\"" (nth i %l) "\";width=100;fixed_width=true;}}") fp)
   (setq i (1+ i))
)
(write-line
   (strcat "}:column{:slider{key=\"sldr\";layout=vertical;min_value="(itoa (- 0 nof-tog)) ";max_value=0"
    ";small_increment=1;big_increment=10;value=0;}}}spacer;") fp)
)
(defun Tokkie_write_footer ()
(write-line
   (strcat
   "spacer;"
   ": row {: button{label=\"Select All\";key=\"all\";}:button{label=\"Select None\";key=\"none\";}}"
   "spacer;ok_cancel;}") fp))
(defun Tokkie_Dialog ( / n drv inp)
(if (and (setq n 0 dcl (load_dialog fn)) (new_dialog "Tokkie" dcl))
   (progn
   (Tokkie_DialogUpdate)
   (Tokkie_DialogActions)
   (setq drv (start_dialog))
   (if (= drv 1)
(mapcar '(lambda (x y) (if (= x "1")(setq return (cons y return)))) tokkie-list %lst)
(setq return nil))
   )
)
)
(defun Tokkie_DialogUpdate ( / i )
(if (= (type $txt1) 'STR)(set_tile "txt1" $txt1))
(if (= (type $txt2) 'STR)(set_tile "txt2" $txt2))
(set_tile "sldr" (itoa slider-index))
(update_tokkies)
)
(defun Tokkie_DialogActions ()
(repeat 10 (action_tile (strcat "tg" (itoa n)) (strcat "(toggle_me $value " (itoa n) ")" ))(setq n (1+ n)))
(action_tile "sldr" "(update_slider $value)")
(action_tile "all" "(Tokkie_SelectAll)")
(action_tile "none" "(Tokkie_SelectNone)")
(action_tile "ok" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
)
(defun update_slider ( #i ) (setq slider-index (atoi #i)) (Tokkie_DialogUpdate))
(defun update_tokkies (/ tokkie-index tokkie-name i)
;max number of toggles in dialog is 10
(if (> (abs slider-index) (- nof-tog 10))
   (setq tokkie-index (- nof-tog 10))(setq tokkie-index (abs slider-index)))
(if (< tokkie-index 0)(setq tokkie-index 0))
(setq i 0)
(while (and (< i 10) (setq tokkie-name (nth tokkie-index pretty-list)))
   (set_tile (strcat "tp" (itoa i)) tokkie-name)
   (set_tile (strcat "tg" (itoa i)) (nth tokkie-index tokkie-list))
   (setq i (1+ i) tokkie-index (1+ tokkie-index))
)
)

(defun toggle_me ( $v #i / idx )
(if (> (abs slider-index) (- nof-tog 10))(setq idx (- nof-tog 10))(setq idx (abs slider-index)))
(setq tokkie-list (nthSubst (+ #i (if (< idx 0) 0 idx)) $v tokkie-list))
)
(defun Tokkie_SelectAll ();reset all toggles to "1"
;(setq tokkie-list (mapcar '(lambda (x) (chr 49)) %lst))(Tokkie_DialogUpdate))
(setq tokkie-list (mapcar '(lambda (x) (chr 49)) pretty-list))(Tokkie_DialogUpdate))
(defun Tokkie_SelectNone ();reset all toggles to "0"
;(setq tokkie-list (mapcar '(lambda (x) (chr 48)) %lst))(Tokkie_DialogUpdate))
(setq tokkie-list (mapcar '(lambda (x) (chr 48)) pretty-list))(Tokkie_DialogUpdate))
(defun nthSubst (i x l / n) (setq n -1)(mapcar '(lambda (y) (if (eq i (setq n (1+ n))) x y )) l ))
;--- Tokkie ------------------------------------------------------Tokkie ------------------------------------------------------- Tokkie ---
(c:Delete_Dilan)


Rlx级
 
 
ps.pps。编辑代码以包括子功能limitstring、fixitoa&void,这是我的lib的一部分,有一些小的子功能,所以我第一次忘记了,只是在发布后才注意到

ronjonp 发表于 2022-7-5 15:55:01

试试这个:
(defun c:foo (/ tmp)
;; Deletes "*.txt" files in temp dir!
(foreach x (vl-directory-files (setq tmp (getenv "temp")) "*.txt")
   (vl-file-delete (strcat tmp "\\" x))
   (print (strcat "DELETING >> " tmp "\\" x))
)
(princ)
)(vl-load-com)

dilan 发表于 2022-7-5 15:59:05

 
非常感谢。这就是你需要的。我怎么能不删除所有文件呢。“Temp”文件夹中的txt?例如,我需要删除文件123。txt和321。txt。。。

Grrr 发表于 2022-7-5 16:02:36

Rlx,您使用的GetFolder子函数中有一个小问题-如果用户指定了文件夹,则不会释放shell应用程序对象。
另一方面,我认为(思考?,更像是从公共科研机构研究的)必须不惜一切代价释放这些“外部acad对象”(这意味着错误捕获/包装)。
因此,您可以使用一种更可靠的方法:
 
; msg - - optional prompt message
; defpath - - optional default path
; newfolderopt - T = display option to create new folder, else don't
; Examples: (GetFolder nil nil nil) ; (GetFolder "Hello world" "D:\\GAMES" T)
(defun GetFolder ( msg defpath newfolderopt / shell folder parentfolder path )
(vl-catch-all-apply
   (function
   (lambda nil
       (setq shell (vlax-get-or-create-object "Shell.Application"))
       (setq folder (vlax-invoke-method shell 'BrowseForFolder 0 (cond (msg)("")) (if newfolderopt 0 512) (cond (defpath) ((strcat (getenv "userprofile") "\\Desktop\\")))))
       (setq parentfolder (vlax-get-property folder 'ParentFolder))
       (setq path (vlax-get-property (vlax-invoke-method parentfolder 'Parsename (vlax-get-property folder 'Title)) 'Path))
   )
   )
)
(foreach x (reverse (list shell folder parentfolder path)) (vl-catch-all-apply 'vlax-release-object (list x))) path
); defun GetFolder
 

Lee Mac 发表于 2022-7-5 16:06:30

http://lee-mac.com/directorydialog.html

Grrr 发表于 2022-7-5 16:07:04

 
这是一个完美的方法,我只是想利用一下我的灰质。

rlx 发表于 2022-7-5 16:12:53

 
 
只需快速从我的一些应用程序中删除一些代码,这样可能就不是最好的了。另一方面,我花了大约两分钟。。。但你是对的,要么清理掉我的一些旧stuf。感谢Thanx的更新和建议,非常感谢,永远不会太老
 
 
 
 
 
 
gr.Rlx
页: [1] 2
查看完整版本: 删除文件、目录或文件夹