繁体   English   中英

如何在 c# 控制台应用程序中获取 exe 的初始路径

[英]How to get initial path of exe in c# console application

所以总结一下,我正在制作一个应该在 exe 文件夹中查找 txt 的程序,如果它没有找到 txt,它将创建它,当我运行程序时,txt 不存在。 这就是我获得exe的目录/路径的方式:

string dir = AppDomain.CurrentDomain.BaseDirectory;

所以我尝试将“dir”写入控制台,它为我提供了目录:

C:\Users\alvin\AppData\Local\Temp.net\GlosFörhör\gbmh2ttz.bkf\glosor.txt

它位于 windows 临时文件夹中。 我猜控制台应用程序在 windows 临时目录中运行。 但我需要的是实际 exe 文件的目录/路径。 我怎样才能做到这一点?

继承人的代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace GlosFörhör
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] lang1 = { "word1", "word2", "g", "a", "d" };
            string[] lang2 = { "word1", "word2", "g", "a", "d" };

            bool running = true;
            bool firstTime = true;

            while (running)
            {
                if (firstTime)
                {
                    main(lang1, lang2);
                    running = false;
                }
            }

            void main(string[] lang1, string[] lang2)
            {
                Console.WriteLine(getValidTxt());
                Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
                Console.ReadLine();

                int[] choiceSeed = getChoiceSeed(lang1);
                lang1 = followSeed(choiceSeed, lang1);
                lang2 = followSeed(choiceSeed, lang2);

                int score = 0;

                for (int m = 0; m < lang1.Length; m++)
                {
                    Console.WriteLine(lang1[m]);
                    string input = Console.ReadLine();
                    if (input.ToLower() == lang2[m].ToLower())
                    {
                        Console.WriteLine("Rätt!");
                        score++;
                    }
                    else
                    {
                        Console.WriteLine("Tyvärr, fel :(");
                    }

                }
                Console.WriteLine();
                Console.WriteLine("Du fick " + score + " rätt av " + lang1.Length + " möjliga.");
                Console.ReadLine();
            }

            int[] getChoiceSeed(string[] input)
            {
                var iL = new List<string>(input);
                var rL = new List<int>();
                var intL = new List<int>();

                for (int t = 0; t < input.Length; t++)
                {
                    intL.Add(t);
                }

                for (int t = 0; t < input.Length; t++)
                {
                    Random rnd = new Random();
                    int tmpIDX = rnd.Next(0, (iL.Count));
                    rL.Add(intL[tmpIDX]);
                    iL.RemoveAt(tmpIDX);
                    intL.RemoveAt(tmpIDX);
                }

                int[] r = rL.ToArray();
                return r;
            }

            string[] followSeed(int[] seed, string[] input)
            {
                var rL = new List<string>();

                foreach (int i in seed)
                {
                    rL.Add(input[i]);
                }

                string[] r = rL.ToArray();
                return r;
            }

            string getValidTxt()
            {
                
                string dir = AppDomain.CurrentDomain.BaseDirectory;
                
                if (File.Exists("glosor.txt"))
                {
                    return dir + "glosor.txt";
                }
                else
                {
                    int txtCnt = 0;
                    var txts = new List<string>();

                    DirectoryInfo di = new DirectoryInfo(dir);
                    foreach (FileInfo file in di.GetFiles())
                    {
                        if (file.ToString().Substring(file.ToString().Length - 4) == ".txt")
                        {
                            txtCnt++;
                            txts.Add(file.ToString());
                        }
                    }

                    if (txtCnt > 0)
                    {
                        return dir + txts[0];
                    }
                    else
                    {
                        File.Create(dir + "glosor.txt");
                        Environment.Exit(0);
                        return dir + "glosor.txt";
                    }
                }
            }
        }
    }
}

该程序应该接收两个 arrays 单词(lang1 和 lang2)并将它们打印到控制台并“检查”用户以另一种语言编写它们,这对于例如功课很有用。 无论如何,我从 txt 文件中获取 arrays 的部分就是我卡住的地方。 “getValidTxt”方法将首先检查文件“glosor.txt”是否在目录中,如果是则返回文件“glosor.txt”的路径,只需添加目录和“glosor.txt”即可”。 但是,如果没有,它将检查是否有任何其他以“.txt”结尾的文件,如果有,它会将它们添加到列表中并返回第一项以及目录。 如果没有,它将添加“glosor.txt”,并关闭程序,以便用户可以将单词输入到txt中。

“getChoiceSeed”和“followSeed”只是为了随机化单词的顺序。

假设您的可执行文件是标准应用程序(例如控制台应用程序)或类似应用程序,您可以通过几种不同的方式获取当前可执行文件的路径:

  • System.Reflection.Assembly.GetEntryAssembly().Location
    请注意,如果执行进程不是正常的独立可执行文件,这可能是不正确的。

  • Assembly.GetExecutingAssembly().Location
    这提供了当前正在执行的程序集的路径。 如果您的应用程序已通过 GAC 或其他方式与您的应用程序的 rest 分开,则可能是不正确的。

  • System.Environment.ProcessPath
    请注意,如果执行进程不是正常的独立可执行文件,这可能是不正确的。

  • System.Environment.GetCommandLineArgs()[0]
    但请注意,这可能有也可能没有路径信息。

另请参阅我的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM