我正在编写一个小程序,它显示我要做的事情,优先级等。在这个程序中我有两个标签:标签1用于创建新的操作,另一个标签用于显示当前要执行的操作。因此,当我在选项卡1中的文本框中输入一些文本并在单击“保存”按钮后,它应将其保存在tab2的组合框中。当我重新启动程序时,它仍应保存。 Google告诉我用文件执行此操作,以便将其保存到文件中。我找到了一个简短的代码,我根据我的程序进行了调整。在这里你可以看到我的代码:
private void Form1_Load(object sender, EventArgs e)
{
// Check if directory exists
if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
{
// Do nothing
}
else
{
Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
}
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
// Do nothing
}
else
{
File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
}
StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt");
while (sr.Peek() >= 0)
{
combox_Name2.Items.Add(sr.ReadLine());
}
sr.Close();
}
private void btn_Save_Click(object sender, EventArgs e)
{
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
Process.Start(combox_Name2.Text, txt_Name.Text);
if (combox_Name2.Items.Contains(txt_Name.Text))
{
// Do nothing
}
else
{
writer.WriteLine(combox_Name2.Text);
writer.Flush();
writer.Dispose();
combox_Name2.Items.Add(txt_Name.Text);
}
}
catch
{
MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
}
}
我现在的问题是:每当我启动程序时,将一些文本放入文本框并单击“保存”按钮,就会出现错误
StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt");
VS2012说该进程无法进入C:\Users\rs\Desktop\Test\test.txt
,因为它已经在另一个进程中启动。
有人能给我一个暗示吗?
干杯
答案 0 :(得分:2)
以下代码将实现您的目标。如果有效,请标记为答案。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
namespace FileHandling
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Check if directory exists
if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
{
// Do nothing
}
else
{
Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
}
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
// Do nothing
}
else
{
File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
}
using (StreamReader writer = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
{
while (writer.Peek() >= 0)
{
combox_Name2.Items.Add(writer.ReadLine());
}
writer.Close();
}
}
private void btn_Save_Click(object sender, EventArgs e)
{
using (StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
try
{
if (combox_Name2.Items.Contains(txt_Name.Text))
{
MessageBox.Show("The task '" + txt_Name.Text + "' already exist in list", "Task already exists");
}
else
{
combox_Name2.Items.Add(txt_Name.Text);
writer.WriteLine(txt_Name.Text);
writer.Flush();
writer.Dispose();
}
}
catch
{
MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
}
}
}
}
}
答案 1 :(得分:1)
StreamWriter会阻止您在使用该过程中的文件之前关闭它,或者您必须在字符串中进行更改,并且在进程存在时将更新更新到文件中。
答案 2 :(得分:1)
你忘了关闭/处置作家了。这对读者来说也很重要。你应该习惯这样写:
using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
// do your thing here.
}
即使在内部抛出异常,这也会一直关闭流。
这将编译如下:
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
// do your thing here.
}
finally
{
writer.Dispose();
}
实际问题在于: File.Create(@" C:\ Users \ rs \ Desktop \ Test \ test.txt");
文件已创建,但您没有引用该结果。声明public static FileStream Create(
string path
)
这将将结果(FileStream)发送到垃圾箱中,并在垃圾收集器收集它时进行处理。你不知道什么时候发生。该文件将保持打开状态,直到它被垃圾收集。您可以删除整行。如果文件不存在,请不要执行StreamReader部分。
combox_Name2.Items.Clear();
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
using(StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
{
while (sr.Peek() >= 0)
{
combox_Name2.Items.Add(sr.ReadLine());
}
}
}
别忘了删除!在File.Exists。
答案 3 :(得分:1)
始终将实现IDisposable接口的对象放在
中using(IDisposable object goes here)
{
// Do something.
}
在您的情况下,StreamWriter对象。