56

大多数示例显示了如何从确切位置读取文本文件(fe "C:\Users\Owner\Documents\test1.txt")。但是,如何在不写完整路径的情况下读取文本文件,所以我的代码在复制到其他计算机时可以工作。使用 Visual Studio,我向项目(控制台项目)添加了 2 个文本文件,但不知道读取这些文件的最佳方式。希望我清楚地描述了我的问题。也许我需要以不同的方式添加这些 txt 文件(比如直接添加到与 .exe 文件相同的文件夹中)?

4

8 回答 8

66

你可以使用Directory.GetCurrentDirectory

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

它将fileName.txt在应用程序的当前目录中查找文件。

于 2013-07-01T13:06:37.720 回答
39

如果您的应用程序是 Web 服务,Directory.CurrentDirectory则不起作用。

改为使用System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "yourFileName.txt"))

于 2016-04-22T14:35:50.483 回答
13

当您提供路径时,它可以是绝对的/有根的,也可以是相对的。如果您提供相对路径,它将通过获取正在运行的进程的工作目录来解决。

例子:

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

上面的代码和下面的效果一样:

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

如果您的文件相对于您的应用程序总是位于相同的位置,只需包含它们的相对路径,它们应该在不同的计算机上正确解析。

于 2013-07-01T13:06:37.850 回答
3

您需要决定您希望文件与哪个目录相关。完成此操作后,您将构建完整路径,如下所示:

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

如果您不提供基本目录dir,那么您将完全受制于进程的工作目录发生的任何事情。那是你无法控制的事情。例如,您的应用程序的快捷方式可能会指定它。使用文件对话框可以改变它。

对于控制台应用程序,直接使用相关文件是合理的,因为控制台应用程序的设计使得工作目录是一个关键输入,并且是执行环境的一个明确定义的部分。但是,对于不是这种情况的 GUI 应用程序,这就是为什么我建议您使用一些明确定义的基本目录将您的相对文件名显式转换为完整的绝对路径的原因。

现在,由于您有一个控制台应用程序,因此使用相对路径是合理的,前提是预期相关文件将位于工作目录中。但情况并非如此是很常见的。通常工作目录用于指定存储用户的输入和输出文件的位置。它通常不指向程序文件所在的位置。

最后一种选择是不要尝试将这些程序文件部署为外部文本文件。也许更好的选择是将它们作为资源链接到可执行文件。这样它们就与可执行文件绑定在一起,您可以完全避开这个问题。

于 2013-07-01T13:08:43.383 回答
2

您绝对需要知道要读取的文件的位置。然而,这些信息当然可以是相对的,因此它可以很好地适应其他系统。

所以它可能与当前目录(从 获取它Directory.GetCurrentDirectory())或应用程序可执行路径(例如Application.ExecutablePath,如果使用 Windows 窗体或 via Assembly.GetEntryAssembly().Location)或某些特殊的 Windows 目录(如“文档和设置”)相关(您应该Environment.GetFolderPath()使用Environment.SpecialFolder枚举的元素)。

请注意,“当前目录”和可执行文件的路径不一定相同。你需要知道在哪里看!

在任何一种情况下,如果您需要操作路径,请使用 Path 类来拆分或组合路径的各个部分。

于 2013-07-01T13:23:56.843 回答
1

由于您的项目是一个控制台项目,您可以通过 string[] args 将路径传递到要读取的文本文件

static void Main(string[] args)
{
}

在 Main 你可以检查参数是否被传递

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

提取参数

string fileToRead = args[0];

几乎所有语言都支持参数传递的概念,并遵循与 C# 类似的模式。

有关 C# 的更多特定信息,请参阅http://msdn.microsoft.com/en-us/library/vstudio/cb20e19t.aspx

于 2013-07-01T13:14:37.120 回答
1

这将在工作目录中加载一个文件:

        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();
        }

如果您使用控制台,您也可以这样做。它将提示用户写入文件的路径(包括带扩展名的文件名)。

        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();
        }

例如,如果您使用 winforms,请尝试以下简单示例:

        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);
            }
        }
于 2013-07-01T13:31:40.260 回答
0

有很多方法可以获得路径。请参阅提到的 CurrentDirectory。此外,您可以使用 Assembly.GetExecutingAssembly().Location 获取应用程序的完整文件名,然后使用 Path 类获取目录名称。

于 2013-07-01T13:11:05.740 回答