如何在 .NET 项目文件夹中创建文本文件,而不是在默认情况下的 bin/Debug 文件夹中创建文本文件



我在Visual Studio中有一个非常简单的.NET控制台应用程序。我正在尝试将一些单词写入文本文件。

using (StreamWriter file = File.AppendText("log1.txt"))
{
file.WriteLine("Hello from the text file");
}

如果该文件不存在,应用程序将在自动生成的文件夹 bin/Debug 中创建该文件。 有没有办法在我有 .csproj 文件的项目目录中创建此文件?

更重要的是,在实际应用程序中,当您处理文件时,将它们保存在bin/Debug中?这就是 .NET 首先在那里创建它们的原因?

没有办法在我有 .csproj 文件的项目目录中创建此文件?

是的,但这只能在您处理项目时完成。一旦您完成开发并尝试发布它,您将无法访问您拥有.csproj文件的位置,因为发布后您可以将其安装在任何 PC 上,并且它不会包含您正在处理的项目。

更重要的是,在实际应用程序中,当您处理文件时,将它们保存在bin/Debug中?

不,我假设在您的上下文中,实际应用程序是指可以在任何PC上运行的已发布项目".exe"。Windows 为您提供了三个数据文件夹,在编写程序时应使用这些文件夹,以便在发布后顺利运行:

  • 用户数据
  • 漫游用户数据
  • 所有用户数据

您可以使用以下Environment.SpecialFolder在 .NET 应用程序中访问上述文件夹:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

根据您给定的代码,请尝试以下操作:

var fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), 
"log1.txt");
using (StreamWriter file = File.AppendText(fileName))
{
file.WriteLine("Hello from the text file");
}

这样,您将能够发布程序,并且它仍然可以顺利运行,而无需像以前那样对路径进行硬编码。

这就是 .NET 首先在那里创建它们的原因?

如果未指定完整路径,并且仅文件名 .NET 查找可执行文件的工作目录,在本例中为bin/Debug

没有办法在我有 .csproj 文件的项目目录中创建此文件?

是的。如此处所述(第二个答案),您可以使用 post-build 事件在文本文件中记下$(ProjectDir)的值(使用命令echo $(ProjectDir) > ....projectdir.txt)。此宏包含.csproj的目录。此命令将在构建过程后使用项目目录创建文件projectdir.txt以便您在代码中读取此文件内容,并使用其中的内容传递给File.AppendText作为基目录来创建文件log1.txt

更重要的是,在实际应用程序中,当您处理文件时,将它们保存在bin/Debug中?这就是 .NET 首先在那里创建它们的原因?

这取决于你想做什么。在您的情况下,代码会在bin/Debug创建文件,因为这是执行可执行文件的位置。当您省略File.AppendText的完整路径并仅"log1.txt"作为参数传递时,它将在可执行文件所在的文件夹中创建文件。如果你想要一个不同的文件夹,你应该在这里指定文件夹(例如File.AppendText("C:/log1.txt")将在C:/创建文件。

您可以在项目的根目录中创建文本文件,并始终使用 copy 将它们与可执行文件放在同一位置。如果这只是一个只读文本文件,那么没关系,因为Windows不允许您修改位于操作系统驱动器的"程序"文件夹中的文件。

如果您希望代码修改这些文本文件,则需要将它们放在 appdata 文件夹中。在现实世界的例子中,我在许多项目中都这样做了。所有数据库工作我的winforms,WPF应用程序需要都在AppData文件夹中。