找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2678|回复: 17

[推荐]:我翻译整理的VLISP磁盘操作函数

[复制链接]

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2004-7-4 10:39:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
VLISP磁盘操作函数,通过ACTIVEX接口

  1.   [FONT=courier new]
  2. ;|  类型库智能化加载
  3. 用法: (vlax-load-type-libeary ProgID[STRING] UniquePrefix[STR])
  4.         (vlax-load-type-libeary ProgID[STRING] PrefixList[STR])
  5.   参数1: 与vlax-get-create-object 函数相同的ProgID 字符串
  6.   参数2: 前缀,可以是字符串或表
  7.          表的顺序 (:methods-prefix :properties-prefix :constants-prefix)
  8. 说明:
  9.     此函数读取 Windows REGISTRY 并且侦测合适的 DLL/OCX/EXE 类型库并自动加载

  10. 返回值:
  11. [成功]: T
  12. [失败]: NIL
  13. |;
  14. (Defun vlax-load-type-library
  15.        (File Prefix / FileX Host N KeyX Val OSVar rtn)
  16.   (setq        Host "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID"
  17.         N    -1
  18.         KeyX (vl-registry-descendents Host)
  19.   )
  20.   (while (< (setq N (1+ N))
  21.             (length KeyX)
  22.          )
  23.     (if        (and (setq Val (vl-registry-read
  24.                          (strcat Host "\" (nth N KeyX) "\\ProgID")
  25.                        )
  26.              )
  27.              (vl-string-search (strcase File) (strcase Val))
  28.         )
  29.       (setq FileX (vl-registry-read
  30.                     (strcat Host "\" (nth N KeyX) "\\InProcServer32")
  31.                   )
  32.             N          (length KeyX)
  33.       )
  34.     )
  35.   )
  36.   (if (= (type Prefix) 'STR)
  37.     (setq Prefix (list Prefix Prefix (strcat ":" Prefix)))
  38.   )
  39.   (if (= (type FileX) 'LIST)
  40.     (setq FileX (cdr FileX))
  41.   )
  42.   (if (= (type FileX) 'STR)
  43.     (progn
  44.       (setq FileX (strcase FileX))
  45.       (foreach OSVar (list "SYSTEMROOT"             "WINDIR"
  46.                            "WINBOOTDIR"             "SYSTEMDRIVE"
  47.                            "USERNAME"             "COMPUTERNAME"
  48.                            "HOMEDRIVE"             "HOMEPATH"
  49.                            "PROGRAMFILES"
  50.                           )
  51.         (if (vl-string-search (strcat "%" OSVar "%") FileX)
  52.           (setq        FileX (vl-string-subst
  53.                         (strcase (getenv OSVar))
  54.                         (strcat "%" OSVar "%")
  55.                         FileX
  56.                       )
  57.           )
  58.         )
  59.       )
  60.       (if (setq rtn (findfile FileX))
  61.         (setq rtn
  62.                (vlax-import-type-library
  63.                  :tlb-filename
  64.                  FileX
  65.                  :methods-prefix
  66.                  (nth 0 Prefix)
  67.                  :properties-prefix
  68.                  (nth 1 Prefix)
  69.                  :constants-prefix
  70.                  (nth 2 Prefix)
  71.                )
  72.         )
  73.       )
  74.     )
  75.   )
  76.   rtn
  77. )
  78. ;|  转换路径中字符 "/" 为 "\" 并返回大写值
  79. 用法: (vldos-formatpath PathStringToFormat[STRING])
  80.   参数1: 路径字符串
  81. 说明:
  82.     此函数转换字符 "/" 为 "\".
  83. 返回值:
  84. [成功]: 转换后的字符串
  85. [失败]: None
  86. |;
  87. (Defun vldos-formatpath        (string)
  88.   (while (vl-string-search "/" string)
  89.     (setq string (vl-string-subst "\" "/" string))
  90.   )
  91.   (while (vl-string-search "\\\" string)
  92.     (setq string (vl-string-subst "\" "\\\" string))
  93.   )
  94.   (setq string (strcase string))
  95.   string
  96. )
  97. ;|  修改本地磁盘的卷标
  98. 用法: (vldos-label DriveLetter[STRING] NewVolumnName[STRING])
  99.   参数1: 盘符 例如: "C" 或 "C:"
  100.   参数2: 新卷标, 如果长度超过11个字符, 自动裁掉
  101.         <<< 本函数不检查字符串是否符合命名规则 >>>
  102. 说明:
  103.     修改本地磁盘的卷标. 确保具有相应的权限进行此操作
  104. 返回值:
  105. [成功]: 新卷标
  106. [失败]: NIL
  107. |;
  108. (Defun vldos-Label (DRV NEW / Fil DDD ERR)
  109.   (if (> (strlen NEW) 11)
  110.     (setq NEW (substr New 1 11))
  111.   )
  112.   (if (null
  113.         (setq
  114.           Fil (vlax-get-or-create-object "Scripting.FileSystemObject")
  115.         )
  116.       )
  117.     (setq New nil)
  118.     (progn
  119.       (setq DDD (vlax-invoke-method Fil 'GetDrive DRV))
  120.       (vlax-put-property DDD "VolumeName" NEW)
  121.       (if (not (eq (setq NEW (strcase NEW))
  122.                    (strcase (vlax-get-property DDD "VolumeName"))
  123.                )
  124.           )
  125.         (setq NEW nil)
  126.       )
  127.       (vlax-release-object DDD)
  128.       (vlax-release-object FIL)
  129.     )
  130.   )
  131.   NEW
  132. )
  133. ;|  执行 DOS DELTREE 命令
  134. 用法: (vldos-deltree DirectoryToDelete[STRING])
  135.   参数1: 要被删除的目录名称. 此函数不显示确认过程,删除文件夹和所有的子文件夹
  136.         如果参数是根目录,江删除所有的子目录.
  137. 说明:
  138.     通过 ActiveX 执行 DOS DELTREE/Y 命令. 无需确认,无备份.
  139.     返回值:
  140. [成功]: T
  141. [失败]: NIL
  142. |;
  143. (Defun vldos-Deltree (Folder / sf subf FIL Rtn)
  144.   (cond        ((vl-file-directory-p Folder)
  145.          (if (null (setq Fil
  146.                           (vlax-get-or-create-object "Scripting.FileSystemObject")
  147.                    )
  148.              )
  149.            (setq Rtn nil)
  150.            (progn
  151.              (cond
  152.                ((<= (strlen Folder) 3)
  153.                 (if (= (strlen folder) 2)
  154.                   (setq folder (strcat folder "\"))
  155.                 )
  156.                 (setq subf (vl-directory-files Folder nil -1)
  157.                       subf (vl-remove "." subf)
  158.                       subf (vl-remove ".." subf)
  159.                       subf (vl-remove "Recycled" subf)
  160.                 )
  161.                 (foreach sf subf
  162.                   (vlax-invoke-method
  163.                     Fil
  164.                     'DeleteFolder
  165.                     (strcat folder sf)
  166.                     T
  167.                   )
  168.                 )
  169.                )
  170.                (t (vlax-invoke-method Fil 'DeleteFolder Folder T))
  171.              )
  172.              (vlax-release-object FIL)
  173.              (setq Rtn (not (vl-file-directory-p Folder)))
  174.            )
  175.          )
  176.         )
  177.         ((findfile Folder)
  178.          (vl-file-delete folder)
  179.          (setq Rtn (not (findfile Folder)))
  180.         )
  181.   )
  182.   Rtn
  183. )
  184. ;|  创建目录
  185. 用法: (vldos-mkdir DirectoryToCreate[STRING])
  186.   参数1: 目录的全路径名. 此函数会自动创建参数中所有不存在的目录.
  187. 说明:
  188.     可创建多层目录.
  189. 返回值:
  190. [成功]: 创建目录的全路径名
  191. [失败]: NIL
  192. |;
  193. (Defun vldos-MkDir (Folder / FolderX Fil FFF Pos DIR DRV)
  194.   (if (null
  195.         (setq
  196.           Fil (vlax-get-or-create-object "Scripting.FileSystemObject")
  197.         )
  198.       )
  199.     (setq Folder nil)
  200.     (progn
  201.       (while (vl-string-search "/" Folder)
  202.         (setq Folder (vl-string-subst "\" "/" Folder))
  203.       )
  204.       (if (wcmatch Folder "*\")
  205.         (setq Folder (substr Folder 1 (1- (strlen Folder))))
  206.       )
  207.       (setq FolderX Folder)
  208.       (while (setq Pos (vl-string-search "\" Folder))
  209.         (setq FFF    (cons (substr Folder 1 Pos) FFF)
  210.               Folder (substr Folder (+ Pos 2))
  211.         )
  212.       )
  213.       (setq FFF        (reverse (cons Folder FFF))
  214.             DRV        (car FFF)
  215.             FFF        (cdr FFF)
  216.       )
  217.       (foreach DIR FFF
  218.         (if
  219.           (null        (vl-file-directory-p (setq DRV (strcat DRV "\" DIR)))
  220.           )
  221.            (vlax-invoke-method
  222.              Fil
  223.              'createfolder
  224.              DRV
  225.            )
  226.         )
  227.       )
  228.       (vlax-release-object Fil)
  229.       (if (setq Folder (vl-file-directory-p FolderX))
  230.         (setq Folder (vldos-formatpath FolderX))
  231.       )
  232.     )
  233.   )
  234.   Folder
  235. )
  236. ;|  复制文件或目录
  237. 用法: (vldos-copy SourceFile/Directory[STRING] TargetFile/Directory[STRING])
  238.   参数1: 源文件或目录
  239.   参数2: 目标目录. 如果包含 "*\" or "*/", 此函数将在此路径下创建相同的子目录.
  240. 说明:
  241.     复制文件或目录.
  242. 返回值:
  243. [成功]: 复制的文件或目录字符串.
  244. [失败]: NIL
  245. |;
  246. (Defun vldos-copy (from to / sys folder)
  247.   (setq        from (vldos-formatpath from)
  248.         to   (vldos-formatpath to)
  249.   )
  250.   (if (null (vl-file-directory-p to))
  251.     (setq to (vldos-mkdir to))
  252.   )
  253.   (if (setq sys (vlax-get-or-create-object "Shell.Application"))
  254.     (progn
  255.       (if (setq folder (vlax-invoke-method sys 'namespace to))
  256.         (progn
  257.           (princ
  258.             (strcat "\n Copying file(s) from \042"
  259.                     FROM                   "\042 to \042"
  260.                     to                           "\042..."
  261.                    )
  262.           )
  263.           (vlax-invoke-method folder 'copyhere from (+ 4 16))
  264.           (vlax-release-object folder)
  265.           (princ "...Done!")
  266.         )
  267.       )
  268.       (vlax-release-object sys)
  269.     )
  270.   )
  271.   (princ)
  272. )
  273. ;|(Defun vldos-copy2 (From to / rtn)
  274.   (cond
  275.     ((vl-file-directory-p From)
  276.      (if (< (strlen to) 3)
  277.        (setq to (strcat to "\"))
  278.        (if (not (vl-file-directory-p to))
  279.          (vldos-mkdir to)
  280.        )
  281.      )
  282.      (if (setq
  283.            Rtn (vlax-get-or-create-object "Scripting.FileSystemObject")
  284.          )
  285.        (progn
  286.          (vlax-invoke-method Rtn 'CopyFolder From to T)
  287.          (vlax-release-object Rtn)
  288.          (if (vl-file-directory-p to)
  289.            (setq Rtn (vldos-formatpath to))
  290.          )
  291.        )
  292.      )
  293.     )
  294.     ((findfile From)
  295.      (vl-file-copy From to)
  296.      (if (setq rtn (findfile to))
  297.        (setq rtn (vldos-formatpath rtn))
  298.      )
  299.     )
  300.   )
  301.   rtn
  302. )
  303. |;
  304. ;|  移动文件或目录
  305. 用法: (vldos-move SourceFile/Directory[STRING] TargetFile/Directory[STRING])
  306.   参数1: 源文件或目录.
  307.   参数2: 目标目录. 如果包含 "*\" or "*/", 此函数将在此路径下创建相同的子目录.
  308. 说明:
  309.     移动文件或目录.
  310. 返回值:
  311. [成功]: 移动后的文件或目录字符串.
  312. [失败]: NIL
  313. |;
  314. (Defun vldos-move (from to / sys folder)
  315.   (if (setq sys (vlax-get-or-create-object "Shell.Application"))
  316.     (progn
  317.       (setq from   (vldos-formatpath from)
  318.             to           (vldos-formatpath to)
  319.             folder (vlax-invoke-method sys 'namespace to)
  320.       )
  321.       (if folder
  322.         (progn
  323.           (princ
  324.             (strcat "\n Moving file(s) from \042"
  325.                     FROM                   "\042 to \042"
  326.                     to                           "\042..."
  327.                    )
  328.           )
  329.           (vlax-invoke-method folder 'movehere from (+ 4 16))
  330.           (vlax-release-object folder)
  331.           (princ "...Done!")
  332.         )
  333.       )
  334.       (vlax-release-object sys)
  335.     )
  336.   )
  337.   (princ)
  338. )
  339. ;|  重命名文件或目录
  340. 用法: (vldos-rename SourceFile/Directory[STRING] NewName[STRING])
  341.   参数1: 源文件或目录.
  342.   参数2: 新名称.
  343. 说明:
  344.     Move a file or a folder.
  345. 返回值:
  346. [成功]: 重命名后的文件或目录.
  347. [失败]: NIL
  348. |;
  349. (Defun vldos-rename (From to / Fil folder new parent rtn)
  350.   (cond
  351.     ((vl-file-directory-p From)
  352.      (setq parent (vl-filename-directory From)
  353.            new          (strcat parent to)
  354.      )
  355.      (if (and (setq
  356.                 Fil
  357.                  (vlax-get-or-create-object "Scripting.FileSystemObject")
  358.               )
  359.               (> (strlen From) 3)
  360. ;;; Can not rename root folder
  361.               (null (vl-file-directory-p new))
  362. ;;; not an existing folder name
  363.          )
  364.        (progn
  365.          (setq folder (vlax-invoke-method Fil 'GetFolder From))
  366.          (vlax-put-property folder "Name" To)
  367.          (vlax-release-object folder)
  368.          (vlax-release-object Fil)
  369.        )
  370.        (setq parent nil)
  371.      )
  372.     )
  373.     ((findfile From)
  374.      (setq parent (vl-filename-directory from))
  375.      (vl-file-rename From to)
  376.     )
  377.   )
  378.   (if (and parent
  379.            (vl-file-directory-p
  380.              (setq to (strcat parent to))
  381.            )
  382.       )
  383.     (setq rtn (vldos-formatpath to))
  384.   )
  385.   rtn
  386. )
  387. ;|  返回磁盘的类型
  388. 用法: (vldos-drivetype DriveLetter[STRING])
  389.   参数1: 盘符 例如: "C:"
  390. 说明:
  391.     返回磁盘的类型
  392. 返回值:
  393. [成功]: 磁盘的类型
  394. [失败]: NIL
  395. |;
  396. (Defun vldos-drivetype (drv / Fil drives drive typ rtn)
  397.   (setq rtn "INVALID")
  398.   (if
  399.     (and (setq
  400.            Fil (vlax-get-or-create-object "Scripting.FileSystemObject")
  401.          )
  402.          (equal :vlax-true (vlax-invoke-method Fil 'DriveExists drv))
  403.     )
  404.      (progn
  405.        (setq drives (vlax-get-property Fil 'Drives)
  406.              drive  (vlax-get-property drives 'Item drv)
  407.              typ    (vlax-get-property drive 'DriveType)
  408.              rtn    (nth typ
  409.                          (list "UNKNOWN"     "REMOVABLE"
  410.                                "FIXED"             "REMOTE"
  411.                                "CDROM"             "RAMDISK"
  412.                               )
  413.                     )
  414.        )
  415.        (vlax-release-object drive)
  416.        (vlax-release-object drives)
  417.        (vlax-release-object Fil)
  418.      )
  419.   )
  420.   rtn
  421. )

  422. ;|  返回当前的磁盘表
  423. 用法: (vldos-alldrive)
  424. 说明:
  425.     返回当前的磁盘表
  426. 返回值:
  427. [成功]: 返回当前的磁盘表
  428. [失败]: NIL
  429. |;
  430. (Defun vldos-alldrive (/ fil drive drives lst)
  431.   (if (setq Fil (vlax-get-or-create-object "Scripting.FileSystemObject"))
  432.     (progn
  433.       (vlax-for        drive (setq drives (vlax-get-property Fil 'Drives))
  434.         (setq lst (cons (vlax-get-property drive 'DriveLetter) lst))
  435.       )
  436.       (vlax-release-object drives)
  437.       (vlax-release-object Fil)
  438.       (setq lst (reverse lst))
  439.     )
  440.   )
  441.   lst
  442. )

  443. ;|  返回磁盘的特定信息
  444. 用法: (vldos-driveinfo DriveLetter[STRING] key[STRING])
  445.   参数1: 盘符 例如: "C:"
  446.   参数2: 所需磁盘信息的字符串
  447. 说明:
  448.     返回磁盘的特定信息
  449. 返回值:
  450. [成功]: 磁盘的特定信息
  451. [失败]: NIL
  452. 所需磁盘信息的字符串
  453. "TOTALSIZE"    磁盘总空间
  454. "FREESPACE"    磁盘可用空间
  455. "DRIVETYPE"    磁盘类型
  456. "FILESYSTEM"   文件系统类型
  457. "SERIALNUMBER" 磁盘序列号
  458. "SHARENAME"    共享名称
  459. "VOLUMENAME"   磁盘卷标
  460. |;
  461. (Defun vldos-driveinfo (Drv Key / pos rtn)
  462.   (if (/= (type key) 'STR)
  463.     (setq rtn (vldos-alldriveinfo drv))
  464.     (if        (setq pos (vl-position
  465.                     (setq key (strcase key))
  466.                     (list "TOTALSIZE"            "FREESPACE"
  467.                           "DRIVETYPE"            "FILESYSTEM"
  468.                           "SERIALNUMBER"    "SHARENAME"
  469.                           "VOLUMENAME"
  470.                          )
  471.                   )
  472.         )
  473.       (setq rtn (nth pos (vldos-alldriveinfo drv)))
  474.     )
  475.   )
  476.   rtn
  477. )

  478. ;|  返回磁盘的所有信息
  479. 用法: (vldos-alldriveinfo DriveLetter[STRING])
  480.   参数1: 盘符 例如: "C:"
  481. 说明:
  482.     返回磁盘的所有信息
  483. 返回值:
  484. [成功]: 磁盘的所有信息
  485. [失败]: NIL
  486. |;
  487. (Defun vldos-alldriveinfo (Drv / DrvObj FilSys RetVal)
  488.   (if (setq
  489.         FilSys (vlax-get-or-create-object "Scripting.FileSystemObject")
  490.       )
  491.     (progn
  492.       (setq RetVal
  493.              (cond
  494.                ((= (vlax-invoke FilSys "DriveExists" Drv) 0) 0)
  495.                ((setq DrvObj (vlax-invoke FilSys "GetDrive" Drv))
  496.                 (cond
  497.                   ((= (vlax-get DrvObj "IsReady") 0) -1)
  498.                   ((list
  499.                      (/ (vlax-get-property DrvObj "TotalSize") 1000.0)
  500.                      (/ (vlax-get-property DrvObj "FreeSpace") 1000.0)
  501.                      (vlax-get-property DrvObj "DriveType")
  502.                      (vlax-get-property DrvObj "FileSystem")
  503.                      (vlax-get-property DrvObj "SerialNumber")
  504.                      (vlax-get-property DrvObj "ShareName")
  505.                      (vlax-get-property DrvObj "VolumeName")
  506.                    )
  507.                   )
  508.                 )
  509.                )
  510.              )
  511.       )
  512.       (if (EQUAL (TYPE DrvObj) 'vla-object)
  513.         (vlax-release-object DrvObj)
  514.       )
  515.       (vlax-release-object FilSys)
  516.     )
  517.   )
  518.   RetVal
  519. )

  520. ;|  返回文件的特定信息
  521. 用法: (vldos-fileinfo Filename[STRING] key[STRING])
  522.   参数1: 文件全路径名
  523.   参数2: 所需文件信息的字符串
  524. 说明:
  525.     返回文件的特定信息
  526. 返回值:
  527. [成功]: 文件的特定信息
  528. [失败]: NIL
  529. 所需文件信息的字符串
  530. "DATECREATED"         创建日期
  531. "DATELASTMODIFIED"    修改日期
  532. "DATELASTACCESSED"    最后一次访问时间
  533. "TYPE"                文件类型
  534. "SIZE"                文件大小
  535. "ATTRIBUTES"          文件属性
  536. |;
  537. (Defun vldos-fileinfo (Drv Key / pos rtn)
  538.   (if (/= (type key) 'STR)
  539.     (setq rtn (vldos-allfileinfo drv))
  540.     (if        (setq pos (vl-position
  541.                     (setq key (strcase key))
  542.                     (list "DATECREATED"              "DATELASTMODIFIED"
  543.                           "DATELASTACCESSED"  "TYPE"
  544.                           "SIZE"              "ATTRIBUTES"
  545.                          )
  546.                   )
  547.         )
  548.       (setq rtn (nth pos (vldos-allfileinfo drv)))
  549.     )
  550.   )
  551.   rtn
  552. )

  553. ;|  返回文件的所有信息
  554. 用法: (vldos-allfileinfo Filename[STRING])
  555.   参数1: 文件全路径名
  556. 说明:
  557.     返回文件的所有信息
  558. 返回值:
  559. [成功]: 文件的所有信息
  560. [失败]: NIL
  561. |;
  562. (Defun vldos-allfileinfo (Fil / FilObj FilSys RetVal)
  563.   (if (setq FilSys (vlax-create-object "Scripting.FileSystemObject"))
  564.     (progn
  565.       (setq
  566.         RetVal (cond
  567.                  ((= (vlax-invoke FilSys "FileExists" Fil) 0) nil)
  568.                  ((setq FilObj (vlax-invoke FilSys "GetFile" Fil))
  569.                   (list
  570.                     (vlax-get FilObj "DateCreated")
  571.                     (vlax-get FilObj "DateLastModified")
  572.                     (vlax-get FilObj "DateLastAccessed")
  573.                     (vlax-get FilObj "Type")
  574.                     (vlax-get FilObj "Size")
  575.                     (vlax-get FilObj "Attributes")
  576.                   )
  577.                  )
  578.                  (T nil)
  579.                )
  580.       )
  581.       (if (= (type FilObj) 'vla-object)
  582.         (vlax-release-object FilObj)
  583.       )
  584.       (vlax-release-object FilSys)
  585.     )
  586.   )
  587.   RetVal
  588. )
  589. ;|  读文本文件到表 (快于 AutoLISP read-line函数)
  590. 用法: (vldos-readfile FilenameToRead[STRING])
  591.   参数1: 文本文件全路径名. (包括后缀名)
  592.         只有文本文件才能返回正确结果.
  593. 说明:
  594.     读文本文件到表
  595. 返回值:
  596. [成功]: 返回包括文件内容的表
  597. [失败]: NIL
  598. |;
  599. (Defun vldos-readfile
  600.        (Fil / string->list FilObj FilPth FilSys OpnFil All)
  601.   (Defun string->list (String / ID Rtn)
  602.     (if        (null (setq ID (vl-string-search "\r\n" String)))
  603.       (setq Rtn (list String))
  604.       (progn
  605.         (while ID
  606.           (setq        Rtn    (cons (substr String 1 ID) Rtn)
  607.                 String (substr String (+ 3 ID))
  608.                 ID     (vl-string-search "\r\n" String)
  609.           )
  610.         )
  611.         (setq Rtn (reverse (cons String Rtn)))
  612.       )
  613.     )
  614.     Rtn
  615.   )
  616.   (if (AND (setq FilPth (findfile Fil))
  617.            (setq FilSys (vlax-create-object "Scripting.FileSystemObject"))
  618.       )
  619.     (progn
  620.       (setq FilObj (vlax-invoke FilSys "GetFile" FilPth)
  621.             OpnFil (vlax-invoke FilObj "OpenAsTextStream" 1 0)
  622.             All           (string->list (vlax-invoke OpnFil "readall"))
  623.       )
  624.       (vlax-invoke OpnFil "Close")
  625.       (vlax-release-object OpnFil)
  626.       (vlax-release-object FilObj)
  627.       (vlax-release-object FilSys)
  628.     )
  629.   )
  630.   All
  631. )
  632. ;|  将字符串或表写入文件 (快于 AutoLISP write-line函数)
  633. 用法: (vldos-writefile FileNameString[STRING] ContentStringList[LIST] ModeFlag[BOOLEAN])
  634.         (vldos-writefile FileNameString[STRING] ContentString[STRING] ModeFlag[BOOLEAN])
  635.   参数1: 文本文件全路径名. (包括后缀名)
  636.   参数2: 要写入文件的字符串或表
  637.   参数3: 最加或覆盖标志. nil 最加, T 覆盖
  638. 说明:
  639.     将字符串或表写入文件
  640. 返回值:
  641. [成功]: 文本文件全路径名.
  642. [失败]: NIL
  643. |;
  644. (Defun vldos-writefile
  645.                        (Fil          TXT            Mode      /
  646.                         list->string            FilObj    FilPth
  647.                         FilSys          OpnFil    Line
  648.                        )
  649.   (Defun list->string (slist / line rtn)
  650.     (if        (= (type slist) 'str)
  651.       (setq rtn slist)
  652.       (progn
  653.         (setq rtn "")
  654.         (foreach line slist
  655.           (if (= rtn "")
  656.             (setq rtn line)
  657.             (setq rtn (strcat rtn "\r\n" line))
  658.           )
  659.         )
  660.       )
  661.     )
  662.     rtn
  663.   )
  664.   (if TXT
  665.     (progn
  666.       (if (and Mode (findfile Fil))
  667.         (vl-file-delete Fil)
  668.       )
  669.       (if (setq FilSys (vlax-create-object "Scripting.FileSystemObject"))
  670.         (progn
  671.           (if (null (setq FilPth (findfile Fil)))
  672.             (setq OpnFil (vlax-invoke-method
  673.                            FilSys "CreateTextFile" Fil 0 0)
  674.             )
  675.             (setq FilObj (vlax-invoke FilSys "GetFile" FilPth)
  676.                   OpnFil (vlax-invoke FilObj "OpenAsTextStream" 8 0)
  677.             )
  678.           )
  679.           (if OpnFil
  680.             (progn
  681. ;;; VBA WinScript data forReading = 1, forWriting = 2, forAppending = 8;
  682. ;;; TristateUseDefault, TristateTrue, TristateFalse (-2, -1, 0)
  683. ;;;TristateUseDefault (-2) Opens the file using the system default.
  684. ;;;TristateTrue (-1) Open the file as Unicode.
  685. ;;;TristateFalse (0) Open the file as ASCII.
  686.               (vlax-invoke OpnFil "Write" (list->string TXT))
  687.               (vlax-invoke OpnFil "Close")
  688.               (vlax-release-object OpnFil)
  689.               (if (= (type FilObj) 'vla-object)
  690.                 (vlax-release-object FilObj)
  691.               )
  692.               (vlax-release-object FilSys)
  693.             )
  694.           )
  695.         )
  696.       )
  697.       (if (setq Filpth (findfile Fil))
  698.         (setq FilPth (vldos-formatpath filpth))
  699.       )
  700.     )
  701.   )
  702.   filpth
  703. )
  704. ;|  目录浏览对话框
  705. 用法: (vldos-browsedir PromptString[STRING])
  706.         (vldos-writefile NIL)
  707.   参数1: 提示字符串, 如果是 nil, 缺省为 "Select Folder"
  708. 说明:
  709.     显示目录浏览对话框
  710. 返回值:
  711. [成功]: 返回所选目录路径. 如果用户选择取消, 返回 NIL
  712. [失败]: NIL
  713. |;
  714. (Defun vldos-browsedir (msg / WinShell shFolder path catchit rtn)
  715.   (if (null MSG)
  716.     (setq MSG "Select folder")
  717.   )
  718.   (if (setq winshell (vlax-create-object "Shell.Application"))
  719.     (progn
  720.       (setq shFolder
  721.                      (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1)
  722.             catchit
  723.                      (vl-catch-all-apply
  724.                        '(lambda        ()
  725.                           (setq shFolder (vlax-get-property shFolder 'self))
  726.                           (setq path (vlax-get-property shFolder 'path))
  727.                         )
  728.                      )
  729.       )
  730.       (vlax-release-object shFolder)
  731.       (vlax-release-object winshell)
  732.       (if (vl-catch-all-error-p catchit)
  733.         (setq rtn nil)
  734.         (setq rtn (vldos-formatpath path))
  735.       )
  736.     )
  737.   )
  738.   rtn
  739. )
  740. ;|  显示 windows 的确认对话框包括图标和可选按钮
  741. 用法: (vldos-msgbox TitleString[STRING] IconType[STRING/REAL] MessageString[STRING] ButtonType[INT])
  742.   参数1: 标题字符串, 如果是 nil, 缺省为 "Message"
  743.   参数2: 图标类型字符串或整数值. 如果是字符串, 只有第一个字符串有效.
  744.   参数3: 消息字符串, 如果是 nil, 缺省为 "Message HERE"
  745.   参数4: 按钮类型整数值.
  746. 说明:
  747.     显示 windows 的确认对话框
  748. 返回值:
  749. [成功]: 所选按钮的值
  750. [失败]: NIL
  751. ;;;按钮
  752. ;;;0  OK
  753. ;;;1  OK and Cancel
  754. ;;;2  Abort, Retry, and Ignore
  755. ;;;3  Yes, No, Cancel
  756. ;;;4  Yes and No
  757. ;;;5  Retry and Cancel
  758. ;;;图标类型
  759. ;;;16 [X] Stop Mark icon
  760. ;;;32 [?] Question Mark icon
  761. ;;;48 [!] Exclamation Mark icon
  762. ;;;64 [i] Information Mark icon
  763. ;;; 返回值所代表的按钮
  764. ;;;1  OK button
  765. ;;;2  Cancel button
  766. ;;;3  Abort button
  767. ;;;4  Retry button
  768. ;;;5  Ignore button
  769. ;;;6  Yes button
  770. ;;;7  No button
  771. |;
  772. (Defun vldos-msgbox (TITLE ICON MSG BTNS / IDT sys BTN)
  773.   (if (setq sys (vlax-get-or-create-object "WScript.Shell"))
  774.     (progn
  775.       (if (not (equal (type TITLE) 'STR))
  776.         (setq TITLE "Message")
  777.       )
  778.       (cond ((null ICON) (setq ICON 64))
  779.             ((= (type ICON) 'STR)
  780.              (setq ICON        (substr (strcase ICON) 1 1)
  781.                    IDT        (list (cons "X" 16)
  782.                               (cons "?" 32)
  783.                               (cons "!" 48)
  784.                               (cons "i" 64)
  785.                         )
  786.                    ICON        (cdr (assoc ICON IDT))
  787.              )
  788.              (if (null ICON)
  789.                (setq ICON 64)
  790.              )
  791.             )
  792.             ((= (type ICON) 'INT)
  793.              (if (null (member ICON (list 16 32 48 64)))
  794.                (setq ICON 64)
  795.              )
  796.              (t (setq ICON 64))
  797.             )
  798.       )
  799.       (if (not (equal (type MSG) 'STR))
  800.         (setq MSG "Message HERE")
  801.       )
  802.       (cond ((null BTNS) (setq BTNS 0))
  803.             ((= (type BTNS) 'INT)
  804.              (if (or (< BTNS 0) (> BTNS 5))
  805.                (setq BTNS 0)
  806.              )
  807.             )
  808.             (t (setq BTNS 0))
  809.       )
  810.       (setq
  811.         BTN (vlax-invoke-method sys 'popup MSG 0 TITLE (+ ICON BTNS))
  812.       )
  813.       (vlax-release-object sys)
  814.     )
  815.   )
  816.   BTN
  817. )
  818. ;|  当前目录文件搜索. 类似于 DIR /S 命令.
  819. 用法: (vldos-findfile FilenameFullPathString[STRING])
  820.         (vldos-writefile NIL)
  821.   参数1: 文件名. 可以包括扩展符 ("*" and "?").
  822.         如果文件名描述符为 nil ,返回所有的文件包括子目录。
  823. 说明:
  824.     当前目录文件搜索
  825. 返回值:
  826. [成功]: 包括所有符合条件的文件名.
  827. [失败]: NIL
  828. |;
  829. (Defun vldos-findfile (Filename            /                 string->list
  830.                        getallfiles  allfiles         path
  831.                       )
  832.   (Defun string->list (String / ID Rtn)
  833.     (if        (null (setq ID (vl-string-search ";" String)))
  834.       (setq Rtn (list String))
  835.       (progn
  836.         (while ID
  837.           (setq        Rtn    (cons (substr String 1 ID) Rtn)
  838.                 String (substr String (+ 2 ID))
  839.                 ID     (vl-string-search ";" String)
  840.           )
  841.         )
  842.         (setq Rtn (reverse (cons String Rtn)))
  843.       )
  844.     )
  845.     Rtn
  846.   )
  847.   (Defun getallfiles (loc ext / path files rtn)
  848.     (cond
  849.       ((= loc "")
  850.        (foreach        path (string->list (getvar "acadprefix"))
  851.          (setq rtn (append rtn (getallfiles path ext)))
  852.        )
  853.       )
  854.       ((vl-file-directory-p loc)
  855.        (if (null (wcmatch loc "*\"))
  856.          (setq loc (strcat loc "\"))
  857.        )
  858.        (foreach        files (vl-directory-files loc ext)
  859.          (setq rtn (cons (vldos-formatpath (strcat loc files)) rtn))
  860.        )
  861.        (foreach        path (vl-directory-files loc nil -1)
  862.          (if (and (/= path ".")
  863.                   (/= path "..")
  864.              )
  865.            (setq rtn (append rtn (getallfiles (strcat loc path) ext)))
  866.          )
  867.        )
  868.       )
  869.     )
  870.     rtn
  871.   )
  872.   (setq        path         (vldos-formatpath (vl-filename-directory Filename))
  873.         Filename (substr Filename (1+ (strlen path)))
  874.         allfiles (acad_strlsort (getallfiles path filename))
  875.   )
  876.   allfiles
  877. )
  878. ;| 合并两个文本文件
  879. 用法: (vldos-merge MergeBaseFilenameString[STRING] MergeFilenameString[STRING] EraseMergefileFlag[BOOLEAN])
  880.   参数1: 基文件名
  881.   参数2: 将被合并的文件名
  882.   参数3: 是否删除被合并文件的标志.
  883. 说明:
  884.     合并两个文件为一个e
  885. 返回值:
  886. [成功]: 合并后的文件名
  887. [失败]: NIL
  888. |;
  889. (Defun vldos-merge (file1 File2 Erase / rtn)
  890.   (if (and (setq file1 (findfile file1))
  891.            (setq file2 (findfile file2))
  892.       )
  893.     (progn
  894.       (vldos-writefile file1 (vldos-readfile file2) nil)
  895.       (if Erase
  896.         (vl-file-delete File2)
  897.       )
  898.       (setq rtn (findfile file1))
  899.     )
  900.   )
  901.   rtn
  902. )
  903. ;| 通过IE 显示一个 HTML 字符串
  904. 用法: (vldos-text->ie ContentString[STRING])
  905.   参数1: 要显示的字符串或字符串表
  906. 说明:
  907.     传送数据至新打开的IE窗口
  908. 返回值:
  909. [成功]: 包括字符串的新打开的IE窗口
  910. [失败]: NIL
  911. |;
  912. (Defun vldos-text->ie (TXT / list->string ie ln doc)
  913.   (if (= (type TXT) 'STR)
  914.     (setq TXT (list TXT))
  915.   )
  916.   (if (setq ie (vlax-create-object "InternetExplorer.Application"))
  917.     (progn
  918.       (vlax-put-property ie 'menubar 0)
  919.       (vlax-put-property ie 'toolbar 0)
  920.       (vla-put-visible ie t)
  921.       (vlax-invoke-method ie 'navigate "about :blank")
  922.       (setq doc (vlax-get-property ie 'document))
  923.       (foreach ln TXT
  924.         (vlax-invoke-method doc 'writeln ln "")
  925.       )
  926.       (vlax-invoke-method doc 'close)
  927.       (vlax-release-object doc)
  928.       (vlax-release-object ie)
  929.     )
  930.   )
  931. )
  932. ;| 显示时间/日期对话框
  933. 用法: (vldos-time)
  934. 说明:
  935.     通过VLisp调用时间/日期对话框
  936. 返回值:
  937. [成功]: 显示时间/日期对话框
  938. [失败]: NIL
  939. |;
  940. (Defun vldos-time (/ sys)
  941.   (if (setq sys (vlax-create-object "Shell.Application"))
  942.     (progn
  943.       (vlax-invoke-method sys 'settime)
  944.       (vlax-release-object sys)
  945.     )
  946.   )
  947. )

  948.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-4 11:04:50 | 显示全部楼层
不错,好东西。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-4 11:36:03 | 显示全部楼层
谢谢楼主,相当不错的资料。另外请问搂主有没有可按功能分类查询的Vlisp函数查询资料。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-21 19:54:47 | 显示全部楼层
P服啊。能把这么多外部应用程序研究透。不容易。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-22 12:27:25 | 显示全部楼层
老大水平真高,我何时才能看懂呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-23 09:47:08 | 显示全部楼层
怎么会这样???望高手指点迷津!!!
(vldos-driveinfo "d:" "SERIALNUMBER")
; 错误: 参数类型错误: numberp: #<variant 5 20964163584>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-24 13:02:18 | 显示全部楼层
如此高深莫测,小弟不知何年才能看懂一点点。有没有基础一点的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-8 22:41:08 | 显示全部楼层
好高深东西,看来是达不到楼主的水平
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-8 22:49:37 | 显示全部楼层
哦,我一点基础都没有,实在是看不懂。
真佩服楼主的功底!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-9 14:51:14 | 显示全部楼层
我也不懂,很高深啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-9 15:26:14 | 显示全部楼层
有些东西是要靠全面的知识才能摸的透的..
象这些东西你要是不懂"Scripting.FileSystemObject"
系统文件夹属性那你永远也搞不清他是什么意思
不过我可以教你们一个密技.....
用VLAX-DUMP-OBJECT去查各个对象的属性和应用方法
时间长了你就会慢慢了解其中的奥秘..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-9 22:47:41 | 显示全部楼层
不懂,,不懂。。。还是不懂。。还是你们这高手高手高高手的话题吧了。。小弟。。。。服。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-10 08:21:41 | 显示全部楼层
lisp是文本解释型的能懂一点,vlisp看不明白,积累下来,慢慢学
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-10 23:48:02 | 显示全部楼层
我也不懂,很高深啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-11 08:14:05 | 显示全部楼层
最初由 hmh888888 发布
[B]怎么会这样???望高手指点迷津!!!
(vldos-driveinfo "d:" "SERIALNUMBER")
; 错误: 参数类型错误: numberp: #<variant 5 20964163584> [/B]

  1. ;;改了一下
  2. ;|  返回磁盤的所有信息
  3. 用法: (vldos-alldriveinfo DriveLetter[STRING])
  4.   參數1: 盤符 例如: "C:"
  5. 說明:
  6.     返回磁盤的所有信息
  7. 返回值:
  8. [成功]: 磁盤的所有信息
  9. [失敗]: NIL
  10. |;
  11. (defun VLDOS-ALLDRIVEINFO (DRV / DRVOBJ FILSYS RETVAL)
  12.   (if (setq
  13.         FILSYS (vlax-get-or-create-object "Scripting.FileSystemObject")
  14.       )
  15.     (progn
  16.       (setq RETVAL
  17.              (cond
  18.                ((= (vlax-invoke FILSYS "DriveExists" DRV) 0) 0)
  19.                ((setq DRVOBJ (vlax-invoke FILSYS "GetDrive" DRV))
  20.                 (cond
  21.                   ((= (vlax-get DRVOBJ "IsReady") 0) -1)
  22.                   ((list
  23.                      (/ (vlax-get DRVOBJ "TotalSize") 1000.0)
  24.                      (/ (vlax-get DRVOBJ "FreeSpace") 1000.0)
  25.                      (vlax-get DRVOBJ "DriveType")
  26.                      (vlax-get DRVOBJ "FileSystem")
  27.                      (vlax-get DRVOBJ "SerialNumber")
  28.                      (vlax-get DRVOBJ "ShareName")
  29.                      (vlax-get DRVOBJ "VolumeName")
  30.                    )
  31.                   )
  32.                 )
  33.                )
  34.              )
  35.       )
  36.       (if (equal (type DRVOBJ) 'VLA-OBJECT)
  37.         (vlax-release-object DRVOBJ)
  38.       )
  39.       (vlax-release-object FILSYS)
  40.     )
  41.   )
  42.   RETVAL
  43. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-25 22:23 , Processed in 0.500430 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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