在Clojure中列出两个单独目录中的文件
我正试图让泛音在我的Windows10机器上工作。我似乎在试图启动合成器服务器的代码中发现了一个bug。泛音取决于超级准直器,它通过查看超级准直器的安装位置来查找在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
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")))