我想知道这对我来说是否只是一个问题,以及如何解决这个问题。
我现在在$HOME
目录中,我可以touch aaa
创建一个文件。
然后我启动ghci
。我可以import System.Directory
导入此包。
现在问题出现了。如果我尝试doesFileExist aaa
,我会得到True
,因为它确实在那里。如果我尝试doesFileExist ~/aaa
,我会得到False
!
那么问题是什么?如果您发现它不清楚,请编辑我。感谢。
答案 0 :(得分:7)
Haskell与其他几种语言一样,不会将~
解析为主目录。 〜只是一个常见的unix shell功能。所以它正在寻找名为〜。
而是尝试
import System.FilePath.Posix
import System.Directory
homeDirFile :: FilePath -> IO FilePath
homeDirFile p = fmap (</>p) getHomeDirectory
main = homeDirFile "aaa" >>= doesFileExist >>= print
答案 1 :(得分:2)
未执行~
扩展,因为它是shell的一项功能。 doesFileExist "/home/your-user/aaa"
应该有效。您可能希望使用getHomeDirectory
中的System.Directory
。
答案 2 :(得分:1)
您可以通过command-qq与系统shell进行互动。
> import System.Command.QQ
> :set -XQuasiQuotes
> [sh|touch ~/aaa|] :: IO ()
此处您已创建~/aaa
个文件。
答案 3 :(得分:0)
如果你想像shell一样扩展~
,你可以定义一个函数
expandHome :: FilePath -> FilePath -> FilePath
expandHome home ('~':xs) = home ++ xs
expandHome home path = path
这可以称为
λ> h <- getHomeDirectory
λ> expandHome h "~/temp"
"/home/kqr/temp"