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 Cela fonctionne lorsque j'exécute l'exécutable de l'intérieur du répertoire où il vit. Toutefois, si je readfile "./file.txt" code> p>
CD code> à un autre répertoire et exécutez l'exécutable (c'est sur mon chemin), Haskell tente d'obtenir le
file.txt code> dans le répertoire de travail de mon terminal. Comment faire HASKELL Accéder au
fichier.txt code> à 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. P>
4 Réponses :
La bonne façon de procéder est de répertorier fichier.txt code> dans le champ code> fichiers de données code> de votre
.cabal code> fichier et utilisez < Code> getdatafilename code> pour le récupérer. Voir le Documentation Cabal pour l'indépendance du préfixe. < / p>
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 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. P>
raisonnement: Personnellement, je n'aime pas les applications à encombrer ma zone utilisateur principale avec des données de configuration, mais do em> 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. P>
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 code> et seul un administrateur peut écrire dans
c: \ Program Files \ code>. À 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. p>
Pas exactement ce que je cherchais, mais c'est une solution plus propre.
La fonction Edit: les plates-formes de haskell plus récentes avec cette fonction ont depuis été publié. P> getExecutablePath code> fait ce que vous demandez. Malheureusement, il n'a été ajouté qu'à
System.Environment Code> dans le Just publié GHC 7.6.1,
qui n'a pas encore été intégré à une plate-forme HASKELLL Strike>. P>.
#!/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 ()