【问题标题】:How to read existing text files without defining path如何在不定义路径的情况下读取现有文本文件
【发布时间】:2013-06-28 14:47:06
【问题描述】:

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

【问题讨论】:

  • 你想达到什么目的?类似'Read("test1.txt");' ??
  • 就像添加以下内容一样,除了其他答案之外,请记住将文件添加为内容,以便将其复制到输出目录。为此,请右键单击解决方案资源管理器 (test1.txt) 下项目中的文件,选择属性,然后选择“构建操作”作为内容并复制到“输出目录”“始终复制”或“如果复制”更新”。

标签: c# .net text file-io


【解决方案1】:

你可以使用Directory.GetCurrentDirectory:

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

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

【讨论】:

  • Directory.GetCurrentDirectory() 返回“包含当前工作目录路径的字符串,不以反斜杠 (\) 结尾”。使用Path.Combine() 代替字符串连接。
  • 对于控制台应用程序,工作目录通常与包含可执行文件的目录不同。为什么这两个与程序相关的文本文件会放在那里?
  • 它适用于当前驱动器的目录而不是应用程序的目录
  • @DarrenDavies 不会把它当成个人。这对我有用System.AppDomain.CurrentDomain.BaseDirectory,这是因为我的应用程序不是控制台..您可以编辑您的答案,以便我可以删除否决票,我只是注意到 OP 在询问控制台应用程序。
  • @RansomAni-Gizzle - 该解决方案确实有效并满足了 OP 的要求,因此它是公认的答案。我建议您学习并尊重其他社区成员,并在您再次对我投反对票之前阅读实际提出的问题。
【解决方案2】:

当您提供路径时,它可以是绝对的/有根的,也可以是相对的。如果提供了相对路径,会通过运行进程的工作目录来解析。

示例:

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

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

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

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

【讨论】:

    【解决方案3】:

    您需要决定您希望文件相对于哪个目录。完成此操作后,您可以像这样构建完整路径:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果程序集位于 GAC 中会怎样?
      • 一页。所以不适合任何情况,但可以从 exe 调用。
      【解决方案5】:

      由于您的项目是一个控制台项目,您可以通过 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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

            • 是的。 Directory.CurrentDirectory 将是 C:\Program Files (x86)\IIS Express
            • 我无法让它工作,它总是返回 path2 (仅限右侧)。我不知道我是否在这里遗漏了什么。
            猜你喜欢
            • 2011-03-27
            • 2017-05-25
            • 2014-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-10
            • 1970-01-01
            相关资源
            最近更新 更多