如何在不定义路径的情况下读取现有文本文件

时间:2013-07-01 13:05:02

标签: c# .net text file-io

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

8 个答案:

答案 0 :(得分:44)

您可以使用Directory.GetCurrentDirectory

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

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

答案 1 :(得分:19)

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

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

答案 2 :(得分:11)

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

示例:

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

上述代码与以下代码具有相同的效果:

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

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

答案 3 :(得分:3)

您需要确定文件相对于哪个目录。完成后,您可以构建完整路径,如下所示:

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

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

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

现在,由于您有一个控制台应用程序,因此您可以使用相对路径,前提是期望所涉及的文件位于工作目录中。但事实并非如此。通常,工作目录用于指定用户的输入和输出文件的存储位置。它通常不指向程序文件所在的位置。

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

答案 4 :(得分:1)

由于您的项目是控制台项目,您可以通过字符串[] 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

答案 5 :(得分:1)

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

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

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

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

答案 6 :(得分: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);
            }
        }

答案 7 :(得分:0)

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