Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] - Thuật toán tìm kiếm file giống chức năng search của window


  • Please log in to reply
4 replies to this topic

#1 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 27 August 2012 - 11:38 PM

Chào các bạn. Mình có 1 [yêu cầu] mong các bạn giúp đỡ. Mình đang xây dựng 1 ứng dụng trong đó có 1 bước tìm kiếm file trong 1 thư mục. ở bước này mình muốn ứng dụng của mình có thể tìm kiếm file tương tự cơ chế tìm kiếm file của window với các thông số đầu vào như sau: 1) điều kiện tìm kiếm: là 1 phần tên file hoặc phần mở rộng của file. 2) đường dẫn đến thư mục tìm kiếm. Kết quả mong muốn: Trả về danh sách tên file đầy đủ (đường dẫn, tên file và phần mở rộng) hoặc tên thư mục thỏa mãn điều kiện tìm kiếm thuộc thư mục tìm kiếm hoặc thuộc tất cả các thư mục con, cháu, cháu, chắt, chút, chit... của nó. Các bạn viết được dưới dạng 1 hàm con thì càng tốt nhé. Ví dụ: (timkiem "123" "C:\\newfolder\\" ) trả về ("C:\\newfolder\\123.xls" "C:\\newfolder\\123\\" "C:\\newfolder\\123\\abc123xyz.txt" "C:\\newfolder\\123\\abc\\xyz\\123456.dwg") (các bạn thông cảm vì máy tính của mình đang bị lỗi không gõ xuống dòng được nhé). cảm ơn!
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 28 August 2012 - 06:37 AM

Bạn thử cái này của Lee Mac xem đúng ý chưa.

;This subfunction will recursively search all directories beneath (and including) a root directory for a specified file.
;If found, the full filename will be returned; otherwise, this subfunction will return nil.
;;---------------------=={ FindFile }==-----------------------;;
;; Searches the supplied directory and all subdirectories of the supplied directory for the specified file. ;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;; Arguments: ;;
;; file - file to search (w/ext), e.g. "MyFile.txt" ;;
;; directory - Root Directory to search from ;;
;; Returns: Full filename of file if found, else nil. ;;
(defun LM:FindFile ( file directory )
(cond
((findfile (strcat (setq directory (vl-string-right-trim "\\" directory)) "\\" file)) )
((vl-some
(function
(lambda ( dir )
(LM:FindFile file (strcat directory "\\" dir))))
(vl-remove "." (vl-remove ".." (vl-directory-files directory nil -1)))))))
;Example Function Call: _$ (LM:FindFile "MyFile.txt" "C:\\MyFolder") => "C:\\MyFolder\\SubFolder\\MyFile.txt"

  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 28 August 2012 - 06:59 AM

Bạn thử cái này của Lee Mac xem đúng ý chưa.


;This subfunction will recursively search all directories beneath (and including) a root directory for a specified file.
;If found, the full filename will be returned; otherwise, this subfunction will return nil.
;;---------------------=={ FindFile }==-----------------------;;
;; Searches the supplied directory and all subdirectories of the supplied directory for the specified file. ;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;; Arguments: ;;
;; file - file to search (w/ext), e.g. "MyFile.txt" ;;
;; directory - Root Directory to search from ;;
;; Returns: Full filename of file if found, else nil. ;;
(defun LM:FindFile ( file directory )
(cond
((findfile (strcat (setq directory (vl-string-right-trim "\\" directory)) "\\" file)) )
((vl-some
(function
(lambda ( dir )
(LM:FindFile file (strcat directory "\\" dir))))
(vl-remove "." (vl-remove ".." (vl-directory-files directory nil -1)))))))
;Example Function Call: _$ (LM:FindFile "MyFile.txt" "C:\\MyFolder") => "C:\\MyFolder\\SubFolder\\MyFile.txt"

Đọc yêu cầu của bạn chủ topic và dòm code của Lee thì không đúng ý của chủ topic rồi
Bạn ấy còn sử dụng các kí tự đại diện * nữa đó bác
  • 0

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 28 August 2012 - 08:28 AM

Vậy thì cái này của Ketxu đáp ứng được:
http://www.cadviet.c...ic=14210&st=860
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#5 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 22 September 2012 - 01:51 PM

Cảm ơn các bạn. Mình viết được hàm này rồi. thật bất ngờ là nó gần giống hàm của bạn Ketxu viết theo link trên

(defun ST:File_GetAll ( Dir typ )
(append (mapcar '(lambda ( x ) (strcat Dir "\\" x)) (vl-directory-files Dir typ 1))
(apply 'append
(mapcar '(lambda ( x ) (ST:File_GetAll (strcat dir "\\" x) typ))
(cddr (vl-directory-files dir "*" -1))
)
)
)
)

Hàm này của mình. Chỉ khác 1 chút, về thuật toán cũng tương tự nhau

(defun get-all-file (Path FileExt)
(append
(mapcar'(lambda (f) (strcat path f)) (vl-directory-files Path FileExt))
(apply
'append
(mapcar
'(lambda (f) (get-all-file (strcat path f "\\") FileExt))
(cddr (vl-directory-files Path nil -1))))))

  • 0