6
votes

Comment obtenir le répertoire de l'exécutable à Haskell?

J'ai un programme qui lit et écrit un fichier texte qui existe dans le même répertoire que l'exécutable. Pour accéder à ce fichier, j'appelle readfile "./file.txt"

Cela fonctionne lorsque j'exécute l'exécutable de l'intérieur du répertoire où il vit. Toutefois, si je CD à un autre répertoire et exécutez l'exécutable (c'est sur mon chemin), Haskell tente d'obtenir le file.txt dans le répertoire de travail de mon terminal. Comment faire HASKELL Accéder au fichier.txt à partir de l'emplacement de l'exécutable et non mon répertoire de travail. Je ne veux pas coder un chemin absolu parce que je veux que l'exécutable soit quelque peu portable.


0 commentaires

4 Réponses :


8
votes

La bonne façon de procéder est de répertorier fichier.txt dans le champ fichiers de données de votre .cabal fichier et utilisez < Code> getdatafilename pour le récupérer. Voir le Documentation Cabal pour l'indépendance du préfixe. < / p>


0 commentaires

5
votes

Pourquoi ne pas stocker votre fichier dans le répertoire d'applications officiel? Ensuite, cela ne comportera pas ce que le répertoire actuel est. (Voir getappuserdataDirectory .)

Il existe d'autres annuaires utiles et utilitaires de fichier de fichiers utiles dans système.directory . C'est une plate-forme inter-plate-forme dans le sens où elle sait où les choses devraient aller selon votre système d'exploitation.

raisonnement:
Si vous stockez des données de fonctionnement dans le même répertoire que l'exécutable, seule une personne avec des autorisations d'écriture dans ce répertoire peut exécuter correctement votre programme. Seul un superutilisateur peut écrire dans des répertoires comme / usr / local / bin et seul un administrateur peut écrire dans c: \ Program Files \ . À l'aide du répertoire d'applications utilisateur, tout le monde peut exécuter l'application, car le répertoire de données d'application est spécifique à l'utilisateur et aux écrits par eux, c'est pourquoi c'est la bonne pratique.

Personnellement, je n'aime pas les applications à encombrer ma zone utilisateur principale avec des données de configuration, mais do veulent des applications afin de suggérer ma zone d'utilisateur comme première devin d'enregistrer une partie de mon contenu (< href = "http://www.hakell.org/ghc/docs/6.12.2/html/libries/directory-1.0.1.1/directory-directory.html#v%3agethomedirectory" rel = "nofollow"> GetHomeDirectory < / a>). J'ai suggéré le répertoire de données de l'application utilisateur car vous avez suggéré le répertoire de l'exécutable, de sorte que cela sonnait comme des données de configuration.


1 commentaires

Pas exactement ce que je cherchais, mais c'est une solution plus propre.



6
votes

La fonction getExecutablePath fait ce que vous demandez. Malheureusement, il n'a été ajouté qu'à System.Environment dans le Just publié GHC 7.6.1, qui n'a pas encore été intégré à une plate-forme HASKELLL . .

Edit: les plates-formes de haskell plus récentes avec cette fonction ont depuis été publié.


0 commentaires

0
votes
#!/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 ()

0 commentaires