web-dev-qa-db-fra.com

Comment lire des fichiers texte existants sans définir de chemin

La plupart des exemples montrent comment lire un fichier texte à partir de son emplacement exact (par exemple, "C:\Utilisateurs\Propriétaire\Documents\test1.txt"). Mais comment lire des fichiers texte sans écrire le chemin complet, pour que mon code fonctionne lorsqu’il est copié sur d’autres ordinateurs. Avec Visual Studio, j'ai ajouté 2 fichiers texte à projeter (projet de console) et je ne connais pas le meilleur moyen de lire ces fichiers. J'espère que j'ai décrit mon problème clairement. Peut-être devais-je ajouter ces fichiers txt différemment (directement dans le même dossier que le fichier .exe)?

26
Vilius

Vous pouvez utiliser Directory.GetCurrentDirectory :

var path = Path.Combine(Directory.GetCurrentDirectory(), "\\fileName.txt");

Ce qui va chercher le fichier fileName.txt dans le répertoire courant de l'application.

41
Darren

Si votre application est un service Web, Directory.CurrentDirectory ne fonctionne pas. 

Utilisez System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt")) à la place.

17
AXMIM

Lorsque vous fournissez un chemin, il peut être absolu/enraciné ou relatif. Si vous fournissez un chemin relatif, il sera résolu en prenant le répertoire de travail du processus en cours d'exécution.

Exemple:

string text = File.ReadAllText("Some\\Path.txt"); // relative path

Le code ci-dessus a le même effet que le suivant:

string text = File.ReadAllText(
    Path.Combine(Environment.CurrentDirectory, "Some\\Path.txt"));

Si vous avez des fichiers qui se trouveront toujours au même emplacement par rapport à votre application, incluez simplement un chemin relatif vers eux, et ils doivent être résolus correctement sur différents ordinateurs.

10
Dan

Vous devez choisir le répertoire dans lequel vous souhaitez que le fichier soit relatif. Une fois que vous avez fait cela, vous construisez le chemin complet comme ceci:

string fullPathToFile = Path.Combine(dir, fileName);

Si vous ne fournissez pas le répertoire de base dir, vous serez alors totalement à la merci de tout ce qui arrivera au répertoire de travail de votre processus. C'est quelque chose qui peut être hors de votre contrôle. Par exemple, des raccourcis vers votre application peuvent le spécifier. L'utilisation de dialogues de fichiers peut le changer.

Pour une application console, il est raisonnable d'utiliser des fichiers relatifs directement car les applications console sont conçues pour que le répertoire de travail soit une entrée critique et une partie bien définie de l'environnement d'exécution. Cependant, pour une application graphique, ce n'est pas le cas, c'est pourquoi je vous recommande de convertir explicitement votre nom de fichier relatif en chemin absolu complet à l'aide d'un répertoire de base bien défini.

Maintenant que vous avez une application console, il est raisonnable d’utiliser un chemin relatif, à condition que les fichiers en question se trouvent dans le répertoire de travail. Mais il serait très courant que cela ne soit pas le cas. Normalement, le répertoire de travail est utilisé pour spécifier où les fichiers d'entrée et de sortie de l'utilisateur doivent être stockés. Il ne pointe généralement pas vers l'emplacement des fichiers du programme.

Une dernière option est que vous ne tentez pas de déployer ces fichiers de programme en tant que fichiers texte externes. Une meilleure option est peut-être de les lier à l'exécutable en tant que ressources. De cette façon, ils sont liés à l'exécutable et vous pouvez complètement éviter ce problème.

3
David Heffernan

Cela chargera un fichier dans le répertoire de travail:

        static void Main(string[] args)
        {
            string fileName = System.IO.Path.GetFullPath(Directory.GetCurrentDirectory() + @"\Yourfile.txt");

            Console.WriteLine("Your file content is:");
            using (StreamReader sr = File.OpenText(fileName))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    Console.WriteLine(s);
                }
            }

            Console.ReadKey();
        }

Si vous utilisez la console, vous pouvez également le faire. Il demandera à l'utilisateur d'écrire le chemin du fichier (y compris le nom du fichier avec l'extension).

        static void Main(string[] args)
        {

            Console.WriteLine("****please enter path to your file****");
            Console.Write("Path: ");
            string pth = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("Your file content is:");
            using (StreamReader sr = File.OpenText(pth))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    Console.WriteLine(s);
                }
            }

            Console.ReadKey();
        }

Si vous utilisez Winforms par exemple, essayez cet exemple simple:

        private void button1_Click(object sender, EventArgs e)
        {
            string pth = "";
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pth = ofd.FileName;
                textBox1.Text = File.ReadAllText(pth);
            }
        }
1
terrybozzio

Vous devez absolument savoir où se trouvent les fichiers à lire. Cependant, ces informations peuvent être relatives bien sûr, elles peuvent donc être bien adaptées à d’autres systèmes.

Cela peut donc concerner le répertoire en cours (procurez-vous-le auprès de Directory.GetCurrentDirectory()) ou le chemin de l’exécutable de l’application (par exemple, Application.ExecutablePath vous vient à l’esprit si vous utilisez Windows Forms ou via Assembly.GetEntryAssembly().Location) ou un répertoire Windows spécial comme "Documents and Settings" utilisez Environment.GetFolderPath() avec un élément de l'énumération Environment.SpecialFolder).

Notez que le "répertoire actuel" et le chemin de l'exécutable ne sont pas nécessairement identiques. Vous devez savoir où regarder!

Dans les deux cas, si vous devez manipuler un chemin, utilisez la classe Path pour scinder ou combiner des parties du chemin.

1
JeffRSon

Comme votre projet est un projet de console, vous pouvez passer le chemin des fichiers texte que vous voulez lire via la chaîne [] args

static void Main(string[] args)
{
}

Dans Main, vous pouvez vérifier si les arguments sont passés

if (args.Length == 0){ System.Console.WriteLine("Please enter a parameter");}

Extraire un argument

string fileToRead = args[0];

Presque toutes les langues supportent le concept de transmission d'arguments et suivent des modèles similaires à ceux de C #.

Pour plus d'informations sur C #, voir http://msdn.Microsoft.com/en-us/library/vstudio/cb20e19t.aspx

1
armitage

Il y a plusieurs façons d'obtenir un chemin. Voir CurrentDirutorory mentionné. En outre, vous pouvez obtenir le nom de fichier complet de votre application en utilisant Assembly.GetExecutingAssembly (). Location , Puis utilisez la classe Path pour obtenir un nom de répertoire.

0
ElDog