C#异常。文件正由另一个进程使用

时间:2013-09-23 10:45:45

标签: c# file process

我正在玩C#,我遇到了一个问题。 当我尝试创建一个新文件时,程序会断开并说该文件正由另一个进程使用。这可能是我忽略的愚蠢,但我无法弄明白!

这是我的代码:

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();
        }
    }
}

对于长代码片段感到抱歉,但由于我不确定问题源自何处,因此我必须包含所有内容。

7 个答案:

答案 0 :(得分:13)

您的问题是,File.Create会打开stream,允许您按照自己喜欢的方式对文件执行操作:

http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

  

FileStream,提供对path。

中指定的文件的读/写访问权限

因此,从技术上讲,它已经在使用中。

完全删除File.Create。如果文件不存在,StreamWriter将处理创建文件。

此外,投资using构造以正确处理您的文件连接。将来有助于避免这种情况。

答案 1 :(得分:1)

使用

myDropDown_invokedMethod();

而不是

this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod));

答案 2 :(得分:1)

File.Create返回一个保存文件的FileStream对象。您应该使用此对象进行进一步的任务。

var fileStream = File.Create(NameTb.Text + ".txt");
//... do all the writing using fileStream
fileStream.Close();

或者你可以做到

var fs = File.Create(NameTb.Text + ".txt");
fs.Close();
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 
tw.WriteLine("The very first line!");
tw.Close();

答案 3 :(得分:1)

您的问题似乎在SaveBtn_Click事件中,您正在使用目标文件两次写入:

File.Create(NameTb.Text + ".txt");
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 

删除此行:

File.Create(NameTb.Text + ".txt");

答案 4 :(得分:1)

根据MSDN,File.Create Method (String)使用的FileStream在您的情况下不会被关闭。使用这样的东西:

FileStream fs = new FileStream(NameTb.Text + ".txt");
File.Create(fs);
fs.Close();

或@Muctadir Dinar

var fileStream = File.Create(NameTb.Text + ".txt");
//... do all the writing using fileStream
fileStream.Close();

答案 5 :(得分:0)

这是因为 File.Create(NameTb.Text +“。txt”); 使文件保持打开状态:

尝试使用此代码:

    private void SaveBtn_Click(object sender, EventArgs e)
    {
        using(Stream stream = File.Create(NameTb.Text + ".txt"))
        {
            TextWriter tw = new StreamWriter(stream); /* this is where the problem was */
            tw.WriteLine("The very first line!");
            tw.Close();
        }
    }

当方法退出时,这将强制File.Create处理。 dispose将关闭文件句柄(win32非托管句柄)。否则,垃圾收集器将关闭该文件,但您永远不知道何时。

答案 6 :(得分:0)

我看到两种方式: 1)使用System.IO.File.WriteAllText http://msdn.microsoft.com/en-us/library/vstudio/8bh11f1k.aspx 2)阅读有关处置http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

的信息