Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中列出两个单独目录中的文件_Clojure - Fatal编程技术网

在Clojure中列出两个单独目录中的文件

在Clojure中列出两个单独目录中的文件,clojure,Clojure,我正试图让泛音在我的Windows10机器上工作。我似乎在试图启动合成器服务器的代码中发现了一个bug。泛音取决于超级准直器,它通过查看超级准直器的安装位置来查找scsynth.exe。但是应该同时检查C:\Program Files和C:\Program Files(x86)的代码只检查存在的第一个,而不是两个: (import java.io File) (let [p-files-dir (System/getenv "PROGRAMFILES(X86)") p-files-d

我正试图让泛音在我的Windows10机器上工作。我似乎在试图启动合成器服务器的代码中发现了一个bug。泛音取决于超级准直器,它通过查看超级准直器的安装位置来查找
scsynth.exe
。但是应该同时检查
C:\Program Files
C:\Program Files(x86)
的代码只检查存在的第一个,而不是两个:

(import java.io File)
(let [p-files-dir (System/getenv "PROGRAMFILES(X86)")
      p-files-dir (or p-files-dir (System/getenv "PROGRAMFILES"))
      p-files-dir (File. p-files-dir)
      p-files     (map str (.listFiles p-files-dir))
      p-files])
在我的例子中,两个目录都存在,但超级编译器只存在于
C:\Program Files
中。上面的代码段只列出了
C:\ProgramFiles(x86)
中的文件


如何让此代码返回两个目录中的所有文件,并且在一个目录不存在时不中断?

您没有从
let
表单返回某些内容,因此请注意
p-files
[]
之外:

(let [p-files-dir-1 (System/getenv "PROGRAMFILES(X86)")
      p-files-dir-2 (System/getenv "PROGRAMFILES")
      p-files-dir-file-1 (File. p-files-dir-1)
      p-files-dir-file-2 (File. p-files-dir-2)
      p-files (map str (concat 
                         (.listFiles p-files-dir-file-1) 
                         (.listFiles p-files-dir-file-2)))]
  p-files)
您的问题的答案是,您可以将两个列表合在一起,然后需要筛选文件

这里有一个简短的答案(这里不一定需要
map str
):

要删除所有临时变量,可以使用此函数:

(defn env-files [file-name]
  (some-> file-name
          System/getenv
          File.
          .listFiles))
然后代码变成:

(map str (concat
             (env-files "PROGRAMFILES(X86)")
             (env-files "PROGRAMFILES")))

完美的我真的很惊讶
(有些->
能够正确地处理无效的环境变量。
(map str (concat
             (env-files "PROGRAMFILES(X86)")
             (env-files "PROGRAMFILES")))