【问题标题】:How to create text file in .NET project folder, not in bin/Debug folder where is by default如何在 .NET 项目文件夹中创建文本文件,而不是在默认情况下的 bin/Debug 文件夹中
【发布时间】:2019-08-24 22:58:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在实际场景中,您发布应用程序,获取内容(一堆 dll 文件和其他内容),然后将它们部署到您想要的任何位置。这意味着您将没有 bin 或 debug 文件夹。您现在尝试执行的操作仅在使用 Visual Studio 或使用 dotnet run 调试应用程序时有效。
  • 文件在 bin/debug 中创建,因为这是当前工作目录。当您构建解决方案时,您的可执行文件和 dll 会在调试模式下部署
  • 请记住:在 Windows 上,一个进程有一个启动目录(可执行文件所在的位置)和一个工作目录。默认情况下,这些是相同的,但这取决于您如何启动该过程。如果没有给出路径,这种情况下的文件名将在工作目录中解析(程序集解析有其自己的机制)。您手头还有一些其他特殊文件夹,但您需要明确使用它们。

标签: c# .net visual-studio


【解决方案1】:

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

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

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

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

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

您可以使用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

【讨论】:

    【解决方案2】:

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

    是的。正如here (second answer) 解释的那样,您可以使用构建后事件在文本文件中记下$(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:/ 创建文件。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-24
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多