[英]How to create text file in .NET project folder, not in bin/Debug folder where is by default
我在Visual Studio中有一個非常簡單的.NET控制台應用程序。 我正在嘗試將一些單詞寫到文本文件中。
using (StreamWriter file = File.AppendText("log1.txt"))
{
file.WriteLine("Hello from the text file");
}
如果該文件不存在,則應用程序在自動生成的文件夾bin / Debug中創建它。 有沒有一種方法可以在我有.csproj文件的項目目錄中創建此文件?
更重要的是,在實際的應用程序中,當您使用文件時,會將它們保留在bin / Debug中嗎? 這就是為什么.NET首先在此處創建它們的原因?
有沒有一種方法可以在我有.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:/
創建文件。
您可以在項目的根目錄中創建文本文件,並始終使用copy使其與可執行文件位於同一位置。 如果這只是一個只讀文本文件,則可以,因為Windows不允許您修改駐留在OS驅動器中“程序”文件夾中的文件。
如果您想讓代碼修改這些文本文件,則需要將它們放在appdata文件夾中。 在現實世界中,我在許多項目中都這樣做。 我的winforms所有的數據庫工作,WPF應用程序需要放在AppData文件夾中。
有沒有一種方法可以在我有.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.