I'm playing around with C# and I encountered a problem. When I try to make a new file, the program breaks and says that the file is being used by another process. It's probably something stupid that I overlooked, but I cant figure it out!
Here is my code:
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace myNameSpace
{
public partial class MainWindow : Form
{
public static string folderPath = @"fullpath";
public MainWindow()
{
InitializeComponent();
StoredTb.Text = folderPath;
String[] files = Directory.GetFiles(folderPath);
foreach (string file in files)
myDropDown.Items.Add(Path.GetFileNameWithoutExtension(file));
}
private void myDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod));
}
private void myDropDown_invokedMethod()
{
string fullpath = MainWindow.folderPath + myDropDown.SelectedText + ".txt";
StreamReader sr = new StreamReader(fullpath);
NameTb.Text = myDropDown.SelectedText;
DescriptionTb.Text = sr.ReadToEnd();
sr.Close();
}
private void SaveBtn_Click(object sender, EventArgs e)
{
File.Create(NameTb.Text + ".txt");
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); /* this is where the problem occurs */
tw.WriteLine("The very first line!");
tw.Close();
}
}
}
Sorry for the long code snippet, but since I'm not sure where the problem originates from I had to include pretty much everything.
I see 2 ways: 1)use System.IO.File.WriteAllText http://msdn.microsoft.com/en-us/library/vstudio/8bh11f1k.aspx 2)read about disposing http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
File.Create returns a FileStream object which holds your file. You should use this object for further task.
or you could do just
Thats because the File.Create(NameTb.Text + ".txt"); keeps the file open:
try use this instead:
This wil force the
File.Create
to be Disposed when the method has exits. The dispose will close the filehandle (win32 unmanaged handle). Otherwise the file will be closed by the garbage collector, but you never know when.Use
instead of
Your problem seems to be in
SaveBtn_Click
event, you are using your destination file twice for writing:Remove this line:
Your problem is that
File.Create
will open astream
allowing you to do what you like to the file:http://msdn.microsoft.com/en-us/library/d62kzs03.aspx
Therefore, technically, it is in use already.
Just remove the
File.Create
altogether. TheStreamWriter
will handle creating the file if it doesn't exist.Also, invest in
using
constructs to properly dispose of your file connections too. Will help avoid this in the future.