6

実行可能ファイルと同じディレクトリにあるテキストファイルを読み書きするプログラムがあります。そのファイルにアクセスするには、readFile "./file.txt"

これは、実行可能ファイルが存在するディレクトリ内から実行可能ファイルを実行すると機能します。ただし、cd別のディレクトリに移動して実行可能ファイルを実行すると(パス上にあります)、Haskellはfile.txtターミナルの作業ディレクトリからを取得しようとします。file.txtHaskellに作業ディレクトリではなく実行可能ファイルの場所からアクセスさせるにはどうすればよいですか?実行可能ファイルをある程度移植可能にしたいので、絶対パスをハードコーディングしたくありません。

4

4 に答える 4

8

これを行う正しい方法は、ファイルのフィールドにリストfile.txtし、それを使用して取得することです。接頭辞の独立性については、カバールのドキュメントを参照してください。data-files.cabalgetDataFileName

于 2012-09-11T01:42:47.317 に答える
6

関数getExecutablePathはあなたが求めることをします。残念ながらSystem.Environment、リリースされたばかりのGHC 7.6.1にのみ追加されましたが、Haskellプラットフォームにはまだ組み込まれていません

編集:この機能を備えた新しいHaskellプラットフォームがリリースされました。

于 2012-09-11T03:39:58.923 に答える
5

公式のアプリケーションディレクトリにファイルを保存してみませんか?そうすれば、現在のディレクトリが何であるかは関係ありません。( getAppUserDataDirectoryを参照してください。)

System.Directoryには、他にも便利なディレクトリと便利なファイルシステムユーティリティがあります。OSに応じてどこに行くべきかを知っているという意味で、クロスプラットフォームです。

理由:
実行可能ファイルと同じディレクトリに作業データを保存する場合、そのディレクトリに書き込み権限を持つユーザーのみがプログラムを正しく実行できます。スーパーユーザーのみがのようなディレクトリに書き込む/usr/local/binことができ、管理者のみがに書き込むことができますC:\Program Files\。ユーザーアプリケーションディレクトリを使用すると、誰でもアプリを実行できます。これは、アプリケーションデータディレクトリがユーザーに固有であり、ユーザーが書き込みできるためです。そのため、これは良い習慣です。

個人的には、アプリケーションがメインのユーザー領域を構成データで乱雑にするのは好きではありませんが、アプリケーションが必要なので、自分のコンテンツの一部を保存するための最初の推測として、ユーザー領域を提案します(getHomeDirectory)。実行可能ファイルのディレクトリを提案したので、ユーザーアプリケーションのデータディレクトリを提案したので、構成データのように聞こえました。

于 2012-09-11T01:47:00.207 に答える
0
#!/usr/bin/env stack
{- stack
   script
   --nix
   --nix-packages zlib
   --resolver lts-14.17
   --package turtle
   --package protolude
   --package directory
-}

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE CPP #-}

module Playground where

import Protolude hiding (find)
import Turtle
import System.Directory
import Data.String

main :: IO ()
main = do
  let thisScriptAbsFilePath :: String = __FILE__
  let thisScriptAbsFilePath' :: Turtle.FilePath = decodeString thisScriptAbsFilePath
  let projectRoot :: Turtle.FilePath = directory thisScriptAbsFilePath'
  print projectRoot
  return ()
于 2019-12-14T12:48:02.190 に答える