8

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

很抱歉,代码片段很长,但由于我不确定问题出在哪里,所以我必须包含几乎所有内容。

4

7 回答 7

14

你的问题是这File.Create将打开一个stream允许你对文件做你喜欢的事情:

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

一个 FileStream,它提供对 path 中指定的文件的读/写访问。

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

File.Create干脆去掉就行了。StreamWriter如果文件不存在,它将处理创建文件。

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

于 2013-09-23T10:51:11.867 回答
2

根据 MSDN,File.Create 方法(字符串)使用 FileStream,在您的情况下它没有被关闭。使用这样的东西:

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

或@Muctadir 第纳尔

var fileStream = File.Create(NameTb.Text + ".txt");
//... do all the writing using fileStream
fileStream.Close();
于 2013-09-23T10:56:45.197 回答
1

采用

myDropDown_invokedMethod();

代替

this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod));
于 2013-09-23T10:50:51.933 回答
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();
于 2013-09-23T10:53:45.387 回答
1

您的问题似乎是SaveBtn_Click事件,您两次使用目标文件进行写入:

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

删除这一行:

File.Create(NameTb.Text + ".txt");
于 2013-09-23T10:54:02.437 回答
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 非托管句柄)。否则文件将被垃圾收集器关闭,但你永远不知道什么时候。

于 2013-09-23T10:51:19.623 回答
0

我看到 2 种方法: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

于 2013-09-23T10:56:43.937 回答