2012-09-11 59 views
4

我有一個程序讀取和寫入與可執行文件存在於同一目錄中的文本文件。要訪問該文件,我打電話readFile "./file.txt"如何在Haskell中獲取可執行文件的目錄?

這適用於從它所在的目錄內運行可執行文件。但是,如果我cd到另一個目錄並運行可執行文件(它在我的路徑上),Haskell會嘗試從我的終端的工作目錄中獲取file.txt。我如何讓Haskell從可執行文件的位置訪問file.txt,而不是我的工作目錄。我不想硬編碼絕對路徑,因爲我希望可執行文件具有一定的可移植性。

回答

5

爲什麼不將文件存儲在官方應用程序目錄中?那麼它不會影響當前目錄是什麼。 (請參閱getAppUserDataDirectory。)

System.Directory還有其他有用的目錄和方便的文件系統實用程序。它是跨平臺的,因爲它知道根據您的操作系統應該去哪些東西。

推理:
如果您存儲在同一目錄中的可執行文件,只在該目錄寫權限的人能夠正確地運行您的程序的工作數據。只有超級用戶可以寫入像/usr/local/bin這樣的目錄,並且只有管理員可以寫入C:\Program Files\。使用用戶應用程序目錄,任何人都可以運行該應用程序,因爲應用程序數據目錄是特定於用戶的,並且可由他們寫入,所以這就是爲什麼這是最佳做法。

我個人不喜歡的應用程序弄亂我的主要用戶區與配置數據,但希望應用程序,因此建議我的用戶區域作爲第一猜測救我自己的一些內容(getHomeDirectory)。我建議用戶應用程序的數據目錄,因爲你建議可執行文件的目錄,所以它聽起來像配置數據。

+0

不完全是我在找什麼,但這是一個更清潔的解決方案。 –

8

正確的方式做,這是列出file.txt.cabal文件的data-files字段並使用getDataFileName進行檢索。請參閱cabal documentation以獲取前綴獨立性。

3

功能getExecutablePath做你所問。不幸的是,它只被添加到剛發佈的GHC 7.6.1, 中的 System.Environment,該文件尚未被合併到Haskell平臺中,但尚未被納入到 中。

編輯:具有此功能的較新的Haskell平臺已被釋放。

相關問題