如何在不定义路径的情况下读取现有文本文件
本文关键字:读取 文本 文件 情况下 定义 路径 | 更新日期: 2023-09-27 18:20:38
大多数示例都显示了如何从确切的位置读取文本文件(例如"C:''Users''Owner''Documents''test1.txt")。但是,如何在不写完整路径的情况下读取文本文件,因此我的代码在复制到其他计算机时可以工作。使用visualstudio,我在项目(控制台项目)中添加了两个文本文件,但不知道读取这些文件的最佳方式。希望我能清楚地描述我的问题。也许我需要以不同的方式添加这些txt文件(比如直接添加到和.exe文件相同的文件夹中)?
您可以将Directory.GetCurrentDirectory
与Path.Combine
:一起使用
var path = Path.Combine(Directory.GetCurrentDirectory(), "fileName.txt");
它将在应用程序的当前目录中查找文件fileName.txt
。
如果您的应用程序是web服务,Directory.CurrentDirectory
将不起作用。
请改用System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "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应用程序,情况并非如此,这就是为什么我建议您使用一些定义良好的基本目录将相对文件名显式转换为完全绝对路径。
现在,既然您有一个控制台应用程序,那么使用相对路径是合理的,前提是期望有问题的文件位于工作目录中。但如果情况并非如此,那将是非常普遍的。通常,工作目录用于指定用户的输入和输出文件的存储位置。它通常不会指向程序文件所在的位置。
最后一个选项是,您不尝试将这些程序文件部署为外部文本文件。也许更好的选择是将它们作为资源链接到可执行文件。通过这种方式,它们与可执行文件绑定在一起,您可以完全回避这个问题。
您绝对需要知道要读取的文件的位置。然而,这些信息可以是相对的,因此它可以很好地适应其他系统。
因此,它可以与当前目录(从Directory.GetCurrentDirectory()
获取)或应用程序可执行路径(例如,如果使用Windows窗体或通过Assembly.GetEntryAssembly().Location
,会想到Application.ExecutablePath
)或某些特殊的Windows目录(如"Documents and Settings")相关(您应该将Environment.GetFolderPath()
与Environment.SpecialFolder
枚举的一个元素一起使用)。
请注意,"当前目录"和可执行文件的路径不一定相同。你需要知道去哪里找!
在任何一种情况下,如果需要操作路径,请使用path类拆分或组合路径的各个部分。
由于您的项目是控制台项目,您可以通过字符串[]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
这将在工作目录中加载一个文件:
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);
}
}
获取路径的方法有很多。请参阅提到的CurrentDirdirectory。此外,您还可以使用Assembly.GetExecutingAssembly().Location然后使用Path类获取目录名。
小心领先的''
string path2 = "''folderName''fileName.json";
string text = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), path2));
如果路径2不包括根(例如,如果路径2没有以分隔符''
或驱动器规范开头),则结果是两个路径的串联,中间有一个分隔符。如果路径2包括根,则返回路径2。
Path.Combine方法(System.IO)|Microsoft Learn