我正在编写简单的文本编辑器并遇到了保存问题。所以我有2个代码用于保存,一个是使用按钮保存文件和另一个ctrl + s键盘快捷键,当使用按钮保存时一切正常,但是当我用快捷方式保存时我得到这个错误:
“进程无法访问文件,因为它被另一个进程使用”
这是按钮保存的代码:`
saveFileDialog1.FileName = currentname;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter writer = new StreamWriter(saveFileDialog1.OpenFile());
writer.WriteLine(richTextBox1.Text);
writer.Dispose();
writer.Close();
//so i have tabs in my editor so user can switch between them.
//and this is the only way i found which tab is opened now.
for (int i = 0; i < labels.Count; i++)
{
//i created new class that holds some variables including "isUsed"
//and Label itself.
if (labels[i].isUsed)
{
labels[i].Text = Path.GetFileName(saveFileDialog1.FileName);
labels[i].setText(labels[i].Text);
labels[i].path = saveFileDialog1.FileName;
break;
}
}
}`
上面的脚本工作正常,但下面的脚本不能:
public void save(){
bool found = false;
//that is class i made.
AdvancedLabel label = new AdvancedLabel();
//I hold all tabs in "Labels" List.
for (int i = 0; i < labels.Count; i++)
{
//so if loop found the tab that is opened now...
if (labels[i].isUsed)
{
label = labels[i];
found = true;
break;
}
}
if (found)
{
try
{
label.label.Text.Remove(label.label.Text.Length - 1);
//here i always get this error.
StreamWriter writer = new StreamWriter(label.path);
writer.WriteLine(richTextBox1.Text);
label.setText(label.Text.Remove(label.Text.Length - 1));
writer.Dispose();
writer.Close();
}
catch (Exception e)
{
status.Text = "status: " + e.Message + ". Failed to save :(";
}
}
}
以下是完整错误:
mscorlib.dll中出现未处理的“System.IO.IOException”类型异常
Additional information: The process cannot access the file 'C:\Users\nika\Desktop\dd.html' because it is being used by another process.
修改
谢谢你们所有人,因为据我所知,我应该使用“使用”声明,而这里是我想出来的:我忘了提到我也在使用stramreader打开文件。我将其更改为“使用”语句,但同样的事情发生,即使我现在使用:File.appendalltext语句。这也有效,但只有我用按钮保存。
这是我如何改变它(文件开启者不是作家):`
using (var sr = new StreamReader(openFileDialog1.FileName))
{
bool found = false;
for (int i = 0; i < labels.Count; i++)
{
if (labels[i].path == openFileDialog1.FileName)
{
found = true;
break;
}
}
if (!found)
{
richTextBox1.Text = "";
richTextBox1.Text = sr.ReadToEnd();
spawnLabel();
}
}`
ps(听起来很愚蠢)
正如@GauravKP建议:
任何帮助将不胜感激!谢谢!
- 尼克
答案 0 :(得分:0)
始终使用&#34;使用&#34;当你处理流对象时。
using (var stream = ...)
{
/* code */
stream.Close();
}
这就是文档所说的:
通常,当您使用IDisposable对象时,您应该在使用语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法。
正确的方法是关键词。
因为即使我们调用Dispose,&#34; 总是存在不会释放非托管资源的危险,因为对象的使用者无法调用其Dispose方法。&# 34;