newer 发表于 2025-5-14 14:35:00

XD::FILENAME:DIR-ON-PATH


;; ------------------------------------------------------------------------
;;; 函数名称 / function name: XD::FILENAME:DIR-ON-PATH
;;;
;;; 【功能说明 / description】
;;;   该函数用于检查指定的目录 (`DIR`) 是否存在于指定的路径 (`PATH`) 中。
;;;   它首先对目录和路径进行一些预处理(如替换斜杠方向、添加分号等),然后检查目录是否在路径中。
;;;
;;; 【参数说明 / parameters】
;;;   DIR- 需要检查的目录路径(字符串形式)。
;;;   PATH - 用于检查的环境路径(字符串形式),通常是以分号分隔的多个目录路径。
;;;
;;; 【局部变量 / locals】
;;;   DIR2- 修正后的目录路径(考虑到反斜杠的情况)。
;;;   FLAG- 用于标识目录是否存在于路径中的标志值,返回布尔值。
;;;
;;; 【返回值 / return value】
;;;   返回布尔值 `T` 表示目录存在于路径中,返回 `NIL` 表示目录不在路径中。
;;;
;;; 【实现逻辑 / implementation logic】
;;; 1. 如果 `DIR` 和 `PATH` 都有效,执行以下操作:
;;; 2. 如果需要加载 ARX 库,则将路径中的斜杠(`/`)替换为反斜杠(`\`)。
;;; 3. 将 `DIR` 和 `PATH` 转换为大写字母(使用 `XSTRCASE`)。
;;; 4. 检查路径中是否包含分号,如果没有,则添加分号。
;;; 5. 检查目录路径的末尾是否包含反斜杠(`\`),如果没有,则为目录添加一个反斜杠。
;;; 6. 使用 `WCMATCH` 函数检查路径中是否包含目录,若包含则返回 `T`,否则返回 `NIL`。
;;;
;;; 【示例 / example】
;;;   (XD::FILENAME:DIR-ON-PATH "C:\\MyFolder" "C:\\Program Files;C:\\MyFolder;C:\\Windows")
;;;   该调用检查 `C:\\MyFolder` 是否在给定的路径中,若在则返回 `T`,否则返回 `NIL`。
;;;
;; ------------------------------------------------------------------------

(defun XD::FILENAME:DIR-ON-PATH (DIR PATH / DIR2 FLAG)
;; 如果目录和路径都有效
(if (and DIR PATH)
    (progn
      ;; 如果需要加载 ARX 库,则将路径中的斜杠替换为反斜杠
      (if (XD::INIT:FORCE-LOAD-ARX-LIB)
      (progn
          (setq DIR (XD::STR:REPLACE "/" "\\" DIR))   ;; 替换目录中的斜杠
          (setq PATH (XD::STR:REPLACE "/" "\\" PATH)) ;; 替换路径中的斜杠
      )
      )
      
      ;; 将目录和路径转换为大写字母
      (setq DIR (XSTRCASE DIR))
      (setq PATH (XSTRCASE PATH))
      
      ;; 如果路径的开始没有分号,则添加分号
      (if (/= ";" (substr PATH 1 1))
      (progn
          (setq PATH (strcat ";" PATH)) ;; 在路径前加上分号
      )
      )
      
      ;; 如果路径的末尾没有分号,则添加分号
      (if (/= ";" (substr PATH (strlen PATH) 1))
      (progn
          (setq PATH (strcat PATH ";")) ;; 在路径后加上分号
      )
      )
      
      ;; 如果目录路径的末尾没有反斜杠,则添加反斜杠
      (if (= "\\" (substr DIR (strlen DIR)))
      (progn
          (setq DIR2 (substr DIR 1 (- (strlen DIR) 1))) ;; 去掉目录末尾的反斜杠
      )
      (progn
          (setq DIR2 (strcat DIR "\\")) ;; 在目录末尾添加反斜杠
      )
      )
      
      ;; 检查路径中是否包含目录,若包含则设置 FLAG 为 T
      (setq FLAG (or (wcmatch PATH (strcat "*;" DIR ";*"))
                     (wcmatch PATH (strcat "*;" DIR2 ";*"))
               )
      )
    )
)

;; 返回 FLAG,即检查目录是否存在于路径中
FLAG
)

页: [1]
查看完整版本: XD::FILENAME:DIR-ON-PATH