Reputation: 696
I have a very simple .NET console application in Visual Studio. I am trying to write some words into a text file.
using (StreamWriter file = File.AppendText("log1.txt"))
{
file.WriteLine("Hello from the text file");
}
If the file does not exist, the application creates it in the autogenerated folder bin/Debug. Is there a way to create this file in the project's directory, where I have .csproj file?
And more important, in real-world applications, when you work with files, you keep them in bin/Debug? That's why .NET creates them there firstly?
Upvotes: 4
Views: 12325
Reputation: 1409
As @ZorgoZ's comment
on Windows a process has a startup directory (where the executable resides) and a working directory
If you just want to read/write files from the project folder in debug mode, you can set "Project -> Properties -> Debug tab -> Working Directory: $(ProjectDir)" in Visual Studio. This will affect Directory.GetCurrentDirectory, which is set to bin/Debug
by default. Then your code will create log1.txt
in the project folder.
BTW, VC++ use $(ProjectDir)
as Working Directory by default, which is different from C#.
Working directory Specifies the working directory of the app being debugged. In C#, the working directory is \bin\debug by default.
Working directory Specifies the working directory of the program being debugged, relative to the project directory where your EXE is located. If you leave this blank, the working directory is the project directory.
Upvotes: 0
Reputation: 3360
Is there a way to create this file in the project's directory, where I have .csproj file?
Yes, but this can only be done while you are working on your project. Once you are done developing it and try to publish it you won't have access to the location where you have .csproj
file, because after publishing you can install it on any PC and it wont have the project you are working on.
And more important, in real-world applications, when you work with files, you keep them in bin/Debug?
No, I assume by real-world applications in your context you mean a published project '.exe' that you can run on any PC. Windows provides you three Data folders that you should use when writing your program so that it works smoothly after publishing:
You can acess the above folders in .NET application using the Environment.SpecialFolder
:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
As per your given code, try this :
var fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"log1.txt");
using (StreamWriter file = File.AppendText(fileName))
{
file.WriteLine("Hello from the text file");
}
This way you will be able to publish your program and it will still work smoothly without hard-coding the path as you were doing previously.
That's why .NET creates them there firstly?
If you don't specify a complete path, and just the file name .NET looks into the working directory of the executable, which in this case is bin/Debug
Upvotes: 0
Reputation: 9279
You can create the text file in the root of your project and use copy always to have them in the same place as your executable. If this is just a readonly text file then it's OK because windows doesn't allow you to modify the files reside in Programs folder in OS drive.
If you want your code to modify these text file then you need to put them in appdata folder. In real world example I did this on many project. All the database work my winforms, WPF application need goes in AppData folder.
Upvotes: 0
Reputation: 1724
Is there a way to create this file in the project's directory, where I have .csproj file?
Yes. As explained here (second answer) you can use the post-build event to write down the value of $(ProjectDir)
in a text file (using command echo $(ProjectDir) > ..\..\projectdir.txt
). This macro contains the directory of your .csproj
. This command will create the file projectdir.txt with your project directory after a build process so you read this file contents in your code and use what is inside it to pass to File.AppendText
as the base directory to create your file log1.txt
.
And more important, in real-world applications, when you work with files, you keep them in bin/Debug? That's why .NET creates them there firstly?
That depends on what you want to do. In your case the code creates the file at bin/Debug
because that is where your executable are being executed. When you omit the full path to File.AppendText
and just pass "log1.txt"
as argument, it will create the file in the same folder as the executable are at. If you want a different folder you should specify the folder here (e.g. File.AppendText("C:/log1.txt")
will create the file at C:/
.
Upvotes: 0