;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-intermediate-lambda-reader.ss" "lang")((modname locate) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ()))) ;; A directory is ;; - (make-dir string LOFD) (define-struct dir (name content)) ;; A file is ;; - (make-file string num) (define-struct file (name size)) ;; A file-or-directory is either ;; - file ;; - directory ;; A LOFD is either ;; - empty ;; - (cons file-or-directory LOFD) (define escape.rkt (make-file "escape.rkt" 100)) (define kate (make-dir "kate" (list escape.rkt (make-file "map.pdf" 1024)))) (define snacks (make-dir "snacks" (list))) (define lotto.zip (make-file "lotto.zip" 5)) (define hugo (make-dir "hugo" (list snacks lotto.zip))) (define C: (make-dir "C:" (list kate hugo))) ;; find : directory string -> bool ;; To determine whether n exists anywhere starting ;; with dir (define (find dir n) (or (string=? n (dir-name dir)) (lofd-find (dir-content dir) n))) ;; file-find : file string -> bool (define (file-find file n) (string=? (file-name file) n)) ;; fod-find : file-or-directory string -> bool (define (fod-find fod n) (cond [(file? fod) (file-find fod n)] [(dir? fod) (find fod n)])) ;; lofd-find : LOFD string -> bool (define (lofd-find lofd n) (cond [(empty? lofd) false] [(cons? lofd) (or (fod-find (first lofd) n) (lofd-find (rest lofd) n))])) (check-expect (file-find lotto.zip "lotto.zip") true) (check-expect (file-find lotto.zip "escape.rkt") false) (check-expect (fod-find lotto.zip "lotto.zip") true) (check-expect (fod-find lotto.zip "escape.rkt") false) (check-expect (fod-find kate "lotto.zip") false) (check-expect (fod-find hugo "lotto.zip") true) (check-expect (lofd-find empty "lotto.zip") false) (check-expect (lofd-find (list hugo) "lotto.zip") true) (check-expect (lofd-find (list kate (make-file "homework.rkt" 104567)) "lotto.zip") false) (check-expect (find C: "C:") true) (check-expect (find C: "D:") false) (check-expect (find C: "lotto.zip") true) (check-expect (find hugo "C:") false) ;; ---------------------------------------- ;; A path is a non-empty-list-of-string ;; A path-or-false is either ;; - path ;; - false ;; locate : directory string -> path-or-false ;; To find the path of directories to a file ;; named n if its exists under the directory, ;; returning false if it does not exist (define (locate dir n) (cond [(find dir n) (cons (dir-name dir) (lofd-locate (dir-content dir) n))] [else false])) ;; file-locate : file string -> path-or-false (define (file-locate file n) (cond [(string=? (file-name file) n) (list (file-name file))] [else false])) ;; fod-locate : file-or-directory string -> path-or-false (define (fod-locate fod n) (cond [(file? fod) (file-locate fod n)] [(dir? fod) (locate fod n)])) ;; lofd-locate : LOFD string -> path-or-false (define (lofd-locate lofd n) (cond [(empty? lofd) false] [(cons? lofd) (cond [(fod-find (first lofd) n) (fod-locate (first lofd) n)] [else (lofd-locate (rest lofd) n)])])) (check-expect (file-locate escape.rkt "jacob.png") false) (check-expect (file-locate escape.rkt "escape.rkt") (list "escape.rkt")) (check-expect (fod-locate escape.rkt "jacob.png") false) (check-expect (fod-locate escape.rkt "escape.rkt") (list "escape.rkt")) (check-expect (fod-locate kate "jacob.png") false) (check-expect (fod-locate kate "escape.rkt") (list "kate" "escape.rkt")) (check-expect (lofd-locate (list escape.rkt lotto.zip) "jacob.png") false) (check-expect (lofd-locate (list escape.rkt lotto.zip) "escape.rkt") (list "escape.rkt")) (check-expect (lofd-locate (list escape.rkt lotto.zip) "lotto.zip") (list "lotto.zip")) (check-expect (lofd-locate (list lotto.zip kate) "escape.rkt") (list "kate" "escape.rkt")) (check-expect (locate kate "jacob.png") false) (check-expect (locate kate "escape.rkt") (list "kate" "escape.rkt")) (check-expect (locate C: "jacob.png") false) (check-expect (locate C: "map.pdf") (list "C:" "kate" "map.pdf"))