如何在不定义路径的情况下读取现有文本文件
大多数示例显示了如何从确切位置读取文本文件(fe“C:\ Users \ Owner \ Documents \ test1.txt”)。 但是,如何在不写完整路径的情况下读取文本文件,因此我的代码在复制到其他计算机时可以正常工作。 使用visual studio,我将2个文本文件添加到项目(控制台项目),并且不知道阅读这些文件的最佳方法。 希望我能清楚地描述我的问题。 也许我需要不同地添加这些txt文件(比如直接与.exe文件相同的文件夹)?
您可以使用Directory.GetCurrentDirectory
:
var path = Path.Combine(Directory.GetCurrentDirectory(), "\\fileName.txt");
这将在应用程序的当前目录中查找文件fileName.txt
。
如果您的应用程序是Web服务,则Directory.CurrentDirectory
不起作用。
请改用System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt"))
。
提供路径时,它可以是绝对的/有根的,也可以是相对的。 如果提供相对路径,则将通过获取正在运行的进程的工作目录来解析它。
例:
string text = File.ReadAllText("Some\\Path.txt"); // relative path
上面的代码与以下代码具有相同的效果:
string text = File.ReadAllText( Path.Combine(Environment.CurrentDirectory, "Some\\Path.txt"));
如果您的文件始终位于与应用程序相同的位置,则只需包含它们的相对路径,它们应在不同的计算机上正确解析。
您需要确定文件相对于哪个目录。 完成后,您可以构建完整路径,如下所示:
string fullPathToFile = Path.Combine(dir, fileName);
如果你不提供基目录dir
那么你将完全接受你的进程工作目录发生的任何事情。 这可能是你无法控制的。 例如,应用程序的快捷方式可以指定它。 使用文件对话框可以更改它。
对于控制台应用程序,直接使用相关文件是合理的,因为控制台应用程序的设计使得工作目录是一个关键输入,并且是执行环境中定义明确的部分。 但是,对于不是这种情况的GUI应用程序,我建议您使用一些明确定义的基本目录将相关文件名显式转换为完整的绝对路径。
现在,由于您有一个控制台应用程序,因此您可以使用相对路径,前提是期望所涉及的文件位于工作目录中。 但事实并非如此。 通常,工作目录用于指定用户的输入和输出文件的存储位置。 它通常不指向程序文件所在的位置。
最后一个选项是您不要尝试将这些程序文件部署为外部文本文件。 也许更好的选择是将它们作为资源链接到可执行文件。 这样他们就可以与可执行文件绑定,你可以完全支持这个问题。
由于您的项目是一个控制台项目,您可以通过字符串[] 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
您绝对需要知道要读取的文件的位置。 但是,这些信息当然可以是相对的 ,因此它可以很好地适应其他系统。
因此它可能与当前目录(从Directory.GetCurrentDirectory()
获取它)或应用程序可执行路径(例如,如果使用Windows窗体或通过Assembly.GetEntryAssembly().Location
)或某些Application.ExecutablePath
可以想到Application.ExecutablePath
Assembly.GetEntryAssembly().Location
特殊的Windows目录,如“Documents and Settings”(你应该使用Environment.GetFolderPath()
和Environment.SpecialFolder
枚举的一个元素)。
请注意,“当前目录”和可执行文件的路径不一定相同。 你需要知道在哪里看!
在任何一种情况下,如果需要操作路径,请使用Path类拆分或组合路径的各个部分。
这将在工作目录中加载一个文件:
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); } }
有很多方法可以获得路径。 请参阅提到的CurrentDirrectory。 此外,您可以使用Assembly.GetExecutingAssembly()。Location获取应用程序的完整文件名,然后使用Path类获取目录名称。