2014-01-09 87 views
4

是否有可能在Haskell中获取当前源文件的绝对路径?在Haskell中获取当前源文件的绝对路径

我只能找到一个相关函数:getCurrentDirectorySystem.Directory,但它“返回调用进程的当前目录的绝对路径”,而不是当前文件的路径。

(我需要它来阅读这是位于同一文件夹作为源文件样本输入;!如果有什么更好的办法来做到这一点,那将是有益的太)

+0

你是什么意思的“当前文件”?正在运行的编译的可执行文件的路径?或模块的源文件?或者是其他东西? – shang

+0

@shang,对不起,我的意思是源文件。 – Dogbert

+6

这是cabal的工作。使用'data-files'属性指定文件的位置,然后使用'getDataFileName'。更多信息在这里:http://www.haskell.org/cabal/users-guide/developing-packages.html#accessing-data-files-from-package-code – user2407038

回答

0

PseudoMacros package可能是有用的。据描述,它为当前的文件名类似C的字符串等

UPDATE

通过PseudoMacros返回的文件名等于传递给GHC的路径(相同的行为@JoachimBreitner在他的回答中提到) ,所以

import PseudoMacros 

main :: IO() 
main = putStrLn ("Hello from " ++ $__FILE__ ++ ", line " ++ show $__LINE__ ++ "!") 

将打印

Hello from tmp.hs, line 5! 

Hello from /tmp/tmp.hs, line 5! 

这取决于您是否向ghc提供了相对或绝对文件名。

+2

虽然它似乎没有包括目录。 –

+0

@JoachimBreitner行为与您的解决方案相同 - 请参阅我的更新回答 –

+0

好的,抱歉,如果不检查自己,可能会怀疑。 –

5

您可以使用CPP。如果您编译该文件

{-# LANGUAGE CPP #-} 
main = print __FILE__ 

因为你把它传递给ghc它将打印路径源 - 这可能是也可能不是完整的路径,但:

/tmp $ ghc --make mypath.hs 
[1 of 1] Compiling Main    (mypath.hs, mypath.o) 
Linking mypath ... 
/tmp $ ./mypath 
"mypath.hs" 
/tmp $ ghc --make /tmp/mypath.hs 
Linking /tmp/mypath ... 
/tmp $ ./mypath 
"/tmp/mypath.hs" 
3

作为替代,在这里可以使用file-embed包。它使用模板haskell来嵌入文件/目录。

这对于在可执行文件中嵌入资源或配置非常有用。以这种方式阅读样本输入可能不明智。 cabal中的data-files可能是更好的选择,正如本文前面已经指出的那样。

+1

你可以用文件嵌入运行相同的问题,但现在在0.0.10中有一个方便的函数:http: //hackage.haskell.org/package/file-embed-0.0.10/docs/src/Data-FileEmbed.html#makeRelativeToProject – jberryman