如何通过 "directory-exists?" 过滤目录列表?

How is it possible to filter a list of directories via "directory-exists?"?

我最近发现了一个奇怪的 racket 行为:每当我尝试过滤通过 directory-list 我的 REPL 创建的目录列表时,我的 REPL returns 我是一个空列表,但是当我尝试使用一个空列表时准引用列表我的 REPL returns 正确过滤的列表。

我现在的问题是: 为什么无法通过 directory-exists? 过滤目录列表以及如何 仅列出目录 球拍?


一些例子:

当我将 directory-exists?filterdirectory-list 结合使用时,REPL returns 我每次都是空列表:

(filter directory-exists? (map path->complete-path 
                               (directory-list (expand-user-path "~"))))
;; '()

现在,当我过滤一个准引用列表时,如下例所示。 REPL returns 一个正确的过滤列表,包含所有现有目录(没有虚构的目录 ~/blablubb

(filter directory-exists? 
        (map path->complete-path `(,(path->complete-path (expand-user-path "~/documents")) 
                                   ,(expand-user-path "~/blablubb" )))) 
;; '(#<path:/home/niklas/documents>)

FWIW 运行 你的片段

(filter directory-exists? 
   (map path->complete-path 
      (directory-list (expand-user-path "~"))))

在 OS X 上给我一个目录列表。

你显然看到了别的东西。

两个问题:

   1. What is the result of:

   (map path->complete-path 
      (directory-list (expand-user-path "~"))))


   2. Which OS are you using?

directory-list returns 默认相对路径,稍后相对于 (current-directory) 隐式解析,这可能与您传递给 directory-list 的目录不同.

有点像这样:

~ $ ls dir
file1 subdir2
~ $ cat file1
cat: file1: No such file or directory

从当前目录开始,文件位于路径 dir/file1,而不仅仅是 file1

一个解决方案是要求 directory-list 将目录包含在返回的路径中:

(directory-list the-dir #:build? #t)

那么如果the-dir是完整路径,结果也是完整路径。