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

问题描述 投票:0回答:4

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

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

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

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

c# .net visual-studio
4个回答
1
投票

有没有办法在项目目录(我有 .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


0
投票

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

是的。如此处(第二个答案)所述,您可以使用构建后事件在文本文件中记下

$(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:/
创建文件。


0
投票

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

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


0
投票

正如@ZorgoZ 的评论

在 Windows 上,进程有一个启动目录(可执行文件所在的位置)和一个工作目录

如果您只想在调试模式下从项目文件夹中读取/写入文件,可以在 Visual Studio 中设置“项目 -> 属性 -> 调试选项卡 -> 工作目录:$(ProjectDir)”。这将影响 Directory.GetCurrentDirectory,默认设置为

bin/Debug
(即启动目录)。然后您的代码将在项目文件夹中创建
log1.txt

顺便说一句,VC++默认使用

$ProjectDir
作为工作目录,这与C#不同。

C#.Net C#:

工作目录 指定正在调试的应用程序的工作目录。在 C# 中,工作目录默认位于\debug。

VC++:

工作目录 指定正在调试的程序的工作目录,相对于 EXE 所在的项目目录。如果将此字段留空,则工作目录是项目目录。

© www.soinside.com 2019 - 2024. All rights reserved.