Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
ThuyLinh313

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

Các bài được khuyến nghị

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!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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"

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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))))))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×